黑马程序员技术交流社区

标题: 【Java基础交流】之【一张贴搞定异常2】 [打印本页]

作者: 传奇查    时间: 2015-11-18 17:02
标题: 【Java基础交流】之【一张贴搞定异常2】
本帖最后由 传奇查 于 2015-11-18 17:12 编辑

【Java基础交流】之【一张贴搞定异常】!!
http://bbs.itheima.com/thread-261392-1-1.html
(出处: 黑马程序员IT技术论坛)
前篇~~~~~请点击上面↑

对你有用就给个鼓励奖吧~
异常的捕捉:
  1. package cn.fuxi.exception;
  2. /**
  3. * 异常处理的捕捉形式:
  4. * 可以对异常经行针对性处理的方式.
  5. *
  6. * 具体的格式是:
  7. * try{
  8. *                 //需要被检查异常的代码
  9. * } catch(异常类名 变量)//{该变量用于接收发生的异常对象
  10. *                 //处理异常的代码.
  11. * } finally{
  12. *                //一定会执行的代码.
  13. * }
  14. *
  15. * P.S.finally代码块只有一种情况不会被执行,就是在之前执行了System.exit(0)//退出虚拟机
  16. *
  17. * 处理过程:
  18. * try中检测到异常会将异常对象传递给catch,catch捕获到异常经行处理.
  19. * finally里通常用来关闭资源.比如:数据库资源,IO资源等.
  20. * 需要注意:try是一个独立的代码块,其中定义的变量只有在该变量块中有效.
  21. * 如果try以外继续使用,需要在try外建立引用,在try中对其经行初始化.IO,Socket就会遇到.
  22. */
  23. class FuShuIndexException4 extends RuntimeException{
  24.         FuShuIndexException4(){}
  25.         FuShuIndexException4(String msg){
  26.                 super(msg);
  27.         }
  28. }
  29. class Demo4{
  30.         public static int method(int[] arr,int index){
  31.                 if(arr == null){
  32.                         throw new NullPointerException("没有任何数组实体");
  33.                 }
  34.                 if(index < 0){
  35.                         throw new FuShuIndexException4("数组的角标是负数咯~~");
  36.                 }
  37.                 return arr[index];
  38.         }
  39. }
  40. public class ExceptionDemo4 {
  41.         public static void main(String[] args) {
  42.                 int[] arr = new int[6];
  43.                 try{
  44.                         int num = Demo4.method(arr, -30);
  45.                         System.out.println("num: "+ num);
  46.                 }catch(NullPointerException e){
  47.                         System.out.println(e);
  48.                 }catch(FuShuIndexException4 e){
  49.                         System.out.println("message: "+ e.getMessage());
  50.                         System.out.println("String: "+ e);
  51.                         e.printStackTrace();//jvm 默认的异常处理机制就是调用异常对象的这个方法
  52.                         System.out.println("负数角标异常!!!!");
  53.                 }catch(Exception e){//Exception的catch放在最后,是为了先处理有针对性的异常
  54.                         System.out.println("e");
  55.                 }
  56.                 System.out.println("over");
  57.         }
  58. }
复制代码
运行结果:
message: 数组的角标是负数咯~~
String: cn.fuxi.exception.FuShuIndexException4: 数组的角标是负数咯~~
cn.fuxi.exception.FuShuIndexException4: 数组的角标是负数咯~~
at cn.fuxi.exception.Demo4.method(ExceptionDemo4.java:35)
at cn.fuxi.exception.ExceptionDemo4.main(ExceptionDemo4.java:44)
负数角标异常!!!!
over



异常处理方式:
  1. package cn.fuxi.exception;
  2. /**
  3. * 异常处理的原则:
  4. * 1.函数内容如果抛出需要检测的异常,那么函数上必须要声明.
  5. * 否则,必须在函数内用try/catch捕捉,否则编译失败
  6. *
  7. * 2.如果调用到了声明异常的函数,要么try/catch,要么throws,否则编译失败.
  8. *
  9. * 3.什么时候catch,什么时候throws呢?
  10. * 功能内容可以解决,用catch.
  11. * 解决不了,用throws告诉调用者,由调用者解决.
  12. *
  13. * 4.一个功能如果抛出了多个异常,那么调用时,必须有对应多个catch进行针对性处理.
  14. * 内部有几个需要检测的异常,就抛几个异常,抛出几个,就catch几个.
  15. *
  16. * try catch finally 代码块组合特点
  17. * 1.try catch finally
  18. * 2.try catch(多个):当没有资源需要释放时,可以不用定义finally.
  19. * 3.try finally:异常无法直接catch处理,但是资源必须关闭.
  20. */
  21. class Demo5{
  22.         public int show(int index){
  23.                 if(index <0){
  24.                         throw new ArrayIndexOutOfBoundsException("越界啦!!");
  25.                 }
  26.                 int[] arr = new int[3];
  27.                 return arr[index];
  28.         }
  29. }
  30. public class ExceptionDemo5 {
  31.         public static void main(String[] args) {
  32.                 Demo5 d5 = new Demo5();
  33.                 try{
  34.                         int num =d5.show(-4);        
  35.                         System.out.println("num = "+ num);
  36.                 } catch(ArrayIndexOutOfBoundsException e){
  37.                         System.out.println(e.toString());
  38.                         System.out.println(e.getMessage());
  39.                         System.out.println(e.getStackTrace());
  40.                         System.exit(0);
  41.                 }finally{//通常用于关闭(释放)资源
  42.                         System.out.println("finally");//由于前面执行了System.exit(0);故不会执行finally
  43.                 }
  44.                 System.out.println("over");
  45.         }
  46. }
复制代码
运行结果:
java.lang.ArrayIndexOutOfBoundsException: 越界啦!!
越界啦!!
[Ljava.lang.StackTraceElement;@4e823618


案列:
  1. package cn.fuxi.exception;
  2. /**
  3. * 老师用电脑上课.
  4. *
  5. * 问题领域中涉及两个对象.
  6. * 毕老师,电脑
  7. *
  8. * 分析其中的问题
  9. * 比如:电脑蓝屏,冒烟等.
  10. *
  11. * 异常注意事项:
  12. * 1.RuntimeException以及其子类如果在函数中被throw抛出,可以不用在函数上声明.
  13. * 2.子类在覆盖父类方法时,父类的方法如果抛出了异常,那么子类的方法只能抛出父类的异常,或者该异常的子类
  14. * 3.如果父类抛出多个异常,那么子类只能抛出父类异常的子集.
  15. * 简单说:子类覆盖父类只能抛出父类的异常,或者子类的子集.
  16. */
  17. class LanPingException extends Exception{
  18.         LanPingException(String msg){
  19.                 super(msg);
  20.         }
  21. }
  22. class MaoYanException extends Exception{
  23.         MaoYanException(String msg){
  24.                 super(msg);
  25.         }
  26. }
  27. class NoPlanException extends Exception{
  28.         NoPlanException(String msg){
  29.                 super(msg);
  30.         }
  31. }
  32. class Computer{
  33.         private int state = 1;//0,2
  34.         public void run() throws LanPingException, MaoYanException{
  35.                 if(state == 1){
  36.                         throw new LanPingException("电脑蓝屏啦!");
  37.                 }
  38.                 if(state == 2){
  39.                         throw new MaoYanException("电脑冒烟啦!");
  40.                 }
  41.                 System.out.println("电脑正常运行");
  42.         }
  43.         public void reset(){
  44.                 state =0;
  45.                 System.out.println("电脑重启");
  46.         }
  47. }
  48. class Teacher{
  49.         private String name;
  50.         private Computer comp;
  51.         
  52.         Teacher(String name){
  53.                 this.name = name;
  54.                 comp = new Computer();
  55.         }
  56.         public void prelect() throws NoPlanException{
  57.                 try{
  58.                         comp.run();
  59.                         System.out.println(name + "讲课");
  60.                 }catch(LanPingException e){
  61.                         System.out.println(e.toString());
  62.                         comp.reset();
  63.                         prelect();
  64.                 }catch(MaoYanException e){
  65.                         System.out.println(e.toString());
  66.                         test();//对电脑经行维修
  67.                         throw new NoPlanException("课程进度无法完成,原因是:"+e.getMessage());
  68.                 }
  69.         }
  70.         public void test(){
  71.                 System.out.println("大家自习");
  72.         }
  73. }

  74. public class ExceptionDemo6 {
  75.         public static void main(String[] args) {
  76.                 Teacher t = new Teacher("有熊老师");
  77.                 try {
  78.                         t.prelect();
  79.                 } catch (NoPlanException e) {
  80.                         System.out.println(e.toString()+"...");
  81.                         System.out.println("换烈山老师");
  82.                 }
  83.         }
  84. }
复制代码

运行结果:
cn.fuxi.exception.LanPingException: 电脑蓝屏啦!
电脑重启
电脑正常运行
有熊老师讲课

对你有用就给个鼓励奖吧~








作者: 大木木    时间: 2015-11-18 17:18
一辈子都木有见过那么多异常,感觉值的收藏!!!
作者: ppaapc    时间: 2015-11-18 21:07
多谢分享




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2