异常
一.什么是异常
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 }