异常

一.什么是异常

   1.1 代码中发生的异常情况的对象

    1.2 处理方式:自己处理或者传递该异常

    1.3 产生的原因:①java运行时系统产生-->违反语言规范或超出java执行环境限制的基本错误;

                             ②手工代码产生-->报告方法调用程序的出错状况

     1.4异常处理通过:try(可能会出错的代码放入try块中,相当于监视器)、catch(捕捉和try类型一致的异常并且处理)、throw(手动抛出异常)、throws(任何被抛出方法的异常都必须通过throws)、finally(任何方法返回前绝对被执行的代码放置在此)

     1.5 一个异常被抛出,必须被一个异常处理程序捕捉并且被立即处理

      1.6 任何不是被你程序捕获的异常最终都会被该默认处理程序处理(默认处理程序:打印异常发生处的堆栈轨迹并且终止程序)

二.异常类型图

三.try/catch的使用

 

 1 /**
 2  * try/catch的使用:一.自己处理的好处:①允许修正错误②防止程序自动终止-->系统默认处理程序会中断程序运行
 3  *                二.指定永远不会从catch块"返回"到try块
 4  *                三.try/catch必须在同一个大块中
 5  * @author 罗摩衔那
 6  *
 7  */
 8 public class Test02 
 9 {
10    public static void main(String[] args) 
11    {
12     int a=0,b=10;
13     try 
14     {
15         b=b/a;
16         System.out.println("This will not be ptinted");
17     } catch (ArithmeticException e) 
18     {
19         System.out.println("Division by Zero");        
20     }
21     System.out.println("After catch statement");
22    }
23 }

 

 

四.throw的使用

 

 1 /**
 2  * throw的使用-->异常抛出
 3  *   原则:1.执行throw后try块里面的任何语句不执行
 4  *       2.最紧紧包围的try块用来检查它是否含有一个与异常类型匹配的catch语句.
 5  *       如果发现了匹配的块,控制转向该语句;否则,次包围的try块来处理
 6  *       3.如果没有发现匹配的catch块,默认异常处理程序中断程序的执行并且打印堆栈轨迹
 7  * @author 罗摩衔那
 8  *
 9  */
10 public class Test03
11 {
12   public static void main(String[] args) 
13   {
14     try {
15         demo();
16     } catch (NullPointerException e) {
17         System.out.println("Cayght outside");
18         System.out.println(e);//被处理的外部异常
19     }
20   }
21 
22     private static void demo() 
23     {
24         try {
25             //执行throw后try块里面的任何语句不执行
26             throw new NullPointerException("demo");
27         } catch (NullPointerException e) {//异常类型匹配的catch语句捕捉异常
28             System.out.println("Catght inside");
29             throw e;//再次抛出异常,由外层catch处理
30         }
31     }
32 }

 

 

 五.throws的使用

 

 1 /**
 2  * throws子句列举了可能抛出的所有类型异常
 3  * 如果不在①中声明所有可抛出的类型异常,就无法捕捉异常,程序就不会编译
 4  * @author 罗摩衔那
 5  *
 6  */
 7 public class Test04
 8 {
 9   public static void main(String[] args) 
10   {
11     try {
12         demo();
13     } catch (Exception e) {
14       System.out.println(e);
15     }
16   }
17 
18 private static void demo()throws IllegalAccessException//①一个方法可以抛出的所有其他类型的异常必须在throws子句中声明
19  {
20     System.out.println("inside");
21     throw new IllegalAccessException("demo");
22  }
23 }

 

 

 六.finally的使用

 

 1 /*
 2  * finally的使用:无论程序是否发生异常都要执行
 3  *              放置在try/catch位置上
 4  */
 5 public class Demo_Finally 
 6 {
 7   public static void main(String[] args) 
 8   {
 9      try {
10         System.out.println("inside demo");
11         throw new NullPointerException();//抛出异常
12     } catch (NullPointerException e) {//捕获同类型异常
13         System.out.println("异常捕获: "+e);
14     }finally {
15         System.out.println("进入finally代码块");
16     }
17      System.out.println("程序末尾");     
18   }
19 }

 

七.自定义异常

 

 1 public class Test07
 2 {
 3   public static void main(String[] args) 
 4   {
 5     Test07 t=new Test07();//定义类型对象
 6     try {
 7         t.regist(-1);//对象调用方法
 8     } catch (MyException e) {//外层捕捉异常且处理异常
 9         System.out.println("出现错误!错误原因:"+e.getMessage());
10     }
11   }
12 
13     private void regist(int num)throws MyException//方法中声明抛出任何异常
14     {
15         if(num<0)
16         {
17             //抛出异常传递给外层处理
18             throw new MyException("人数为负数",2);//传入异常报错的提示信息
19         }
20     }    
21 }
22 
23 class MyException extends Exception//自定义异常继承Exception异常
24 {
25     private int id;
26     
27     public MyException(String message,int id)
28     {
29         super(message);
30         this.id=id;//regist
31     }
32     public int getId()
33     {
34         return id;
35     }
36 }

 

posted @ 2018-12-02 17:10  静心*尽力  阅读(164)  评论(0编辑  收藏  举报