异常处理
1 /** 2 *异常: 就是程序在运行时出现不正常情况 3 *异常由来: 问题也是现实生活中的事物,也可以通过java类的形式进行描述,并进行封装. 4 * 5 *对于问题的划分: 6 * 1: 严重的问题 (Error) : java通过Error类进行描述,一般不编写针对性的代码进行处理 7 * 2: 非严重的问题 (Exception): java通过Exception类进行描述,一般使用针对性的处理方式进行处理 8 * 9 *无论 Error 或者 Exception 都具有一些共性的内容 10 *比如: 不正常的情况信息,引发原因等 11 * 所以就出现了 "Throwable" 这个父类 12 * 13 * Throwable 14 * |--Error 15 * |--Exception 16 * 17 * 18 *2.异常的处理 19 * java 提供了特有的语句进行处理 20 * 21 * try{ 22 * 需要被检测 23 * }catch(异常类 变量){ 24 * 出来异常的代码:(处理方式) 25 * }finally{ 26 * 一定会执行的语句 27 * } 28 * 29 * 3.对捕获到的异常信息进行处理 30 * 1. String getMessage(); //打印 异常信息 31 * 2. String toString(); //打印 异常名称 : 异常信息 32 * 3. void printStackTrace(); //打印最全名: 异常 名称 : 异常信息 : 异常位置 ; 是 JVM 默认异常处理机制,就是调用这个方法 33 * 34 * 4.问题: 发现下面的程序有时候能正常运行,有时候不能, 因为不是所以认得知道这个方法会抛出异常 ,也不是所有人都会处理 这个异常. 怎么办 ? 35 * 所以就出现 throws 抛出异常 36 */ 37 class Demo{ 38 static int div(int a,int b){ 39 return a/b; 40 } 41 } 42 43 44 public class ExceptionDemo { 45 public static void main(String[] args) { 46 //exception 47 try{ 48 int x=Demo.div(4, 0); //除数不能为0 ,抛出 new ArithmeticException(); 程序会终止 49 System.out.println("x="+x); //出现异常后 这句话就不会被执行 直接进入 catch 语句块中去了 50 }catch(Exception e){ // Exceptioin e= new ArithmeticException(); 51 System.out.println("除数为0啦!"); 52 System.out.println(e.getMessage()); // "/ by zero" 53 System.out.println(e.toString());//toString() 可以省略 打印 异常名称 : 异常信息 54 e.printStackTrace(); //打印最全名: 异常 名称 : 异常信息 : 异常位置. 55 56 } 57 System.out.println("run over"); //运行 完 catch语句块后 , 接着运行 这句 58 59 //error 60 byte[] arr=new byte[1024*1024*6000]; 61 //超出虚拟据总内存大小 不管在怎么样 也不能超过物理内存大小 ,这程序也没戏了. 62 } 63 }
throws 多异常处理
1 /** 2 * throws 3 * 1. throws: 在功能上通过throws的关键字声明该功能有可能出现问题. 4 * 5 * 2.被声明后 我们必须告诉程序的处理方式 6 * 1.采用 try catch 进行处理 7 * 2.继续抛出 异常 ,由jVM 虚拟机 进行异常处理 不过这样 程序 就会终止. 8 * 9 * 10 * 多异常的处理 11 * 1.声明异常时,建议声明更为具体的异常,这样 处理的可以更具体 12 * 比如: 下面 throws ArithmeticException 而不写成 throws Exception 13 * 14 * 2.对于声明多个异常,在调用的时候就应该有几个 catch块.不要定义多余的catch块 ,比如下面注释的 catch块 15 * 如果多个catch中的异常出现了继承关系,父类异常catch块 放在最下面 . 16 * 17 * 建议:在进行catch处理时,catch一定要定义具体的处理方式 18 * 不要简单的一句. e.printStackTrace(); 19 * 也不要简单的就书写一条输出语句 ,一般采用log日志文件 进行 异常信息记录 20 * 21 */ 22 23 class Demo{ 24 static int div(int a,int b) throws ArithmeticException{ 25 26 return a/b; 27 } 28 } 29 30 class Demo1{ 31 static int div(int a,int b) throws ArithmeticException,ArrayIndexOutOfBoundsException{ 32 int [] arr=new int[a]; 33 System.out.println(arr[a+1]); //出现越界 34 return a/b; 35 } 36 } 37 38 public class ExceptionDemo1 { 39 40 /** 41 * thrwos 42 */ 43 public static void main(String[] args) { 44 // 使用第一种方法处理 45 try { 46 Demo.div(4, 0); 47 } catch (Exception e) { 48 System.out.println(e.toString()); 49 } 50 } 51 52 // 使用第二种方法处理 继续往上抛出异常 让 JVM 帮我处理 53 public static void otherMethod() throws ArithmeticException{ 54 Demo.div(4, 0); 55 } 56 57 /** 58 * 多异常处理 59 */ 60 public static void otherMethod1() throws ArithmeticException,ArrayIndexOutOfBoundsException{ 61 Demo1.div(4, 0); 62 } 63 64 public static void otherMethod2() { 65 try { 66 Demo1.div(4, 0); 67 } catch (ArithmeticException e) { 68 System.out.println(e.toString()); 69 System.out.println("被0除了"); 70 }catch(ArrayIndexOutOfBoundsException e){ 71 System.out.println(e.toString()); 72 System.out.println("角标越界"); 73 }/*catch(Exception e){ //这样做只会隐藏 异常 ,这样做是不对的 74 System.out.println(e.toString()); 75 }*/ 76 77 } 78 79 }
throws 和throw 的区别
自定义 异常类
1 /** 2 * 因为项目中会出现特有的问他你. 3 * 而这些问题并未被java所描述和封装成对象 4 * 所以对于一些特有的问题可以安装java的对问题封装的思想. 5 * 将特有的问题,进行自定义的异常封装 6 * 7 * 8 * 自定义异常 9 * 10 * 需求: 在本程序中,对于除数 是-1 也视为错误的,是无法进行运算. 11 * 那么就需要对这个问题进行自定义的描述. 12 * 13 *当函数内部初相了throw抛出异常对象,那么就必须要给对应的处理动作. 14 *要么在内部 try catch 处理 15 *要么子啊函数上声明让调用者处理. 16 * 17 *一般情况下, 函数内部出现异常,函数上需要声明. 18 * 19 *发现 打印的结果中只有异常的名称,却没有异常的信息 20 *因为自定义的异常并未定义信息 21 * 22 *如何定义异常信息呢? 23 * 因为父类中已经把异常信息的操作都做完了 24 * 所以子类只要在构造时,将异常信息传递给父类通过super语句 25 * 就可以直接通过getMessage获取自定义的异常信息 26 * 27 *自定义异常:必须是自定义类继承 Exception 28 * 29 *继承Exception原因: 30 * 异常体系有一个特点,因为异常类和异常对象都被抛出 31 * 因为他们都具备可抛性,这个可抛性是Trowable这个体系中独有的特点. 32 * 33 * 只有这个体系中的类和对象才可以被throw 和 throw 操作 34 * 35 *throws 和throw 的区别 36 *throws:使用在函数上 37 *throw:使用在函数内 38 * 39 *throws:后面跟的异常类,可以跟多个,用逗号分开 40 *throw:后跟的是异常对象. 41 */ 42 class FuShuException extends Exception{ 43 44 /* 45 private String msg; 46 FuShuException(String msg){ 47 this.msg=msg; 48 } 49 public String getMessage(){ 50 return this.msg; 51 } 52 */ 53 FuShuException(String msg,int num){ 54 super(msg); 55 this.value=num; 56 } 57 private int value; 58 59 public int getValue(){ 60 return value; 61 } 62 63 } 64 65 //自定义 异常类 66 class Demo{ 67 68 static int div(int a,int b) throws FuShuException{ 69 if(b<0) 70 throw new FuShuException("出现了除数为零的情况 / by fushu",b); //手动通过throw 关键字抛出一个自定义异常对象. 71 return a/b; 72 } 73 } 74 75 76 public class ExceptionDemo2 { 77 78 public static void main(String[] args) { 79 // TODO Auto-generated method stub 80 try { 81 Demo.div(4, -1); 82 } catch (FuShuException e) { 83 System.out.println(e.toString()); 84 System.out.println("除数出现负数了!"); 85 System.out.println("负数是:"+e.getValue()); 86 } 87 System.out.println("over"); 88 } 89 90 }
RuntimeException
1 /** 2 *RuntimeException: 3 * Exception中有一个非常特殊子类异常,RuntimeException 运行时异常 4 * 如果在函数内部使用throw抛出异常,函数上可以不用throws声明,编译一样通过. 5 * 如果在函数上使用throws声明了该异常,调用者可以不用进行处理,编译一样通过; 6 *之所以不用在函数上使用throws声明,是因为不需要让调用者处理 7 *当异常发送,JVM希望程序停止,因为在运行时,出现了无法继续运算的情况,希望停止程序后,然程序员对代码进行修正 8 * 9 *自定义异常时,如果该异常的发生,无法在继续进行运算,就让自定义异常继承RuntimeException. 10 * 11 *对于异常的分类 12 *1.编译时被检测的异常 (必须使用 throws 或者 try catch进行处理) 13 * 14 *2.编译时不被检测的异常(运行时异常,RuntimeException以及其子类) 程序会停止掉,然后要改进代码 15 * 16 */ 17 class Demo{ 18 static int div(int a,int b){ //发现 这里不需要 throws 怎么回事? 19 if(b==0) 20 throw new ArithmeticException("被零除了!"); //需改 java自定义异常中的提示,改成我们熟悉的 21 return a/b; 22 } 23 24 static int div1(int a,int b)throws ArithmeticException{ 25 //if(b==0) 26 //throw new Exception("被零除了!"); //需改 java自定义异常中的提示 27 return a/b; 28 } 29 30 static int div2(int a,int b){ //发现 这里不需要 throws 怎么回事? 31 if(b<0) 32 throw new FuShuException("出现除数为负数了"); //需改 java自定义异常中的提示 33 if(b==0) 34 throw new ArithmeticException("被零除了!"); 35 return a/b; 36 } 37 38 } 39 //自定义 运行时异常类 40 class FuShuException extends RuntimeException{ 41 42 public FuShuException(String msg) { 43 super(msg); 44 } 45 } 46 47 public class ExceptionDemo3 { 48 49 public static void main(String[] args) { 50 // TODO Auto-generated method stub 51 /*Demo.div(4, 0); // 52 Demo.div1(4, 0); //发现没有 try catch 编译也通过 53 54 Demo.div2(4, -9);*/ 55 56 57 //讲课 58 Teacher t=new Teacher("张老师"); 59 try { 60 t.prelect(); 61 } catch (NoPlanException e) { 62 System.out.println(e.toString()); 63 System.out.println("换老师 或者 放假!"); 64 } 65 } 66 67 } 68 69 70 /* 71 * 老师上课 72 * 73 * 思考上课中出现的问题 74 * 比如问题: 电脑蓝屏 75 * 电脑冒烟 76 * 77 * 要对问题进行封装成对象. 78 * 冒烟后,出现讲课进度无法继续 79 * 出现了讲师的问题,课时计划无法完成. 80 * 81 * throw 和 return 单独存在的时候,后面不能出现 其他语句 82 */ 83 class Teacher{ 84 private String name; 85 86 private Computer cmpt; 87 Teacher(String name){ 88 this.name=name; 89 this.cmpt=new Computer(); 90 } 91 92 public void prelect()throws NoPlanException{ 93 try { 94 cmpt.run(); 95 } catch (LanPingException e) { 96 cmpt.reset(); 97 } catch (MaoYanException e) { 98 test(); 99 throw new NoPlanException("课时无法继续"+e.getMessage()); 100 //test(); //不能放在这里 ,throw 和 return 单独存在的时候,后面不能出现 其他语句 101 } 102 System.out.println("讲课"); 103 } 104 105 public void test(){ 106 System.out.println("练习!"); 107 } 108 109 110 } 111 class Computer{ 112 private int status=3; 113 public void run()throws LanPingException,MaoYanException { 114 if(status==2) 115 throw new LanPingException("蓝屏了"); 116 if(status==3) 117 throw new MaoYanException("冒烟了"); 118 119 System.out.println("电脑运行"); 120 } 121 public void reset(){ 122 this.status=1; 123 System.out.println("电脑重启"); 124 } 125 } 126 127 //封装问题 128 class LanPingException extends Exception{ 129 LanPingException(String message){ 130 super(message); 131 } 132 } 133 134 class MaoYanException extends Exception{ 135 MaoYanException(String message){ 136 super(message); 137 } 138 } 139 //冒烟后的异常 140 class NoPlanException extends Exception{ 141 NoPlanException(String message){ 142 super(message); 143 } 144 }
finally
1 /** 2 * finally代码快:定义一定要执行的代码 3 * 通常用于关闭资源 4 * 如果 catch中 有return 的时候 finally 代码会被执行 而其他的代码不会被执行. 5 */ 6 class FuShuException extends Exception{ 7 FuShuException(String msg){ 8 super(msg); 9 } 10 } 11 12 class Demo{ 13 static int div(int a,int b)throws FuShuException{ 14 if(b<0) 15 throw new FuShuException("除数为负数!"); 16 return a/b; 17 } 18 } 19 class NoException extends Exception{ 20 21 } 22 public class FinallyDemo1 { 23 24 public static void main(String[] args) { 25 test1(); // 除数为负数! finally over 26 27 test2(); // 除数为负数! finally 28 } 29 public static void test1(){ 30 try { 31 int x=Demo.div(4, -1); //1 32 System.out.println("x="+x); 33 } catch (FuShuException e) { 34 System.out.println(e.toString()); //2 35 }finally{ 36 System.out.println("finally"); //3 37 } 38 System.out.println("over"); //4 39 } 40 41 public static void test2(){ 42 try { 43 int x=Demo.div(4, -1); //1 44 System.out.println("x="+x); 45 } catch (FuShuException e) { 46 System.out.println(e.toString()); //2 47 return; // 使用return后 //4 48 }finally{ 49 System.out.println("finally"); //3 50 } 51 System.out.println("over"); 52 } 53 54 55 /** 56 * 采用分层的思想来设计 一般不会抛出 SQLException 给调用者 而是给一个 调用者能看的懂的异常 57 */ 58 public void method()throws /*SQLException*/NoException { 59 //连接数据库 60 //数据操作: //throw new SQLException(); 61 //关闭数据库 62 63 try { 64 //连接数据库 65 //数据操作: 66 }catch (SQLException e) { 67 //会对数据库进行异常操作 68 //throw new SQLException(); 69 throw new NoException(); 70 }finally{ 71 //关闭数据库 72 } 73 } 74 75 }
1 /** 2 * 3 *异常的几种格式 4 * 5 *记住一点:catch是用户处理异常,如果没有catch就代表异常没有被处理过,如果该异常是检测时异常,那么使用 throws必须声明. 6 */ 7 class ExceptionStyle{ 8 //异常的几种格式 9 public void method(){ 10 //第一种格式 11 try { 12 13 } catch (Exception e) { 14 // TODO: handle exception 15 } 16 17 //第二种格式 18 try { 19 20 } catch (Exception e) { 21 // TODO: handle exception 22 }finally{ 23 24 } 25 //第三格式 26 try{ 27 28 }finally{ 29 30 } 31 32 //第四种 格式 33 try { 34 35 }catch (ArithmeticException e) { 36 // TODO: handle exception 37 }catch (Exception e) { 38 // TODO: handle exception 39 } 40 41 } 42 43 //看看下面几种情况 44 45 //错误 没有throws Exception 编译不通过 46 public void method1() /*throws Exception*/{ 47 throw new Exception(); 48 } 49 50 //正确 51 public void method2(){ 52 try { 53 throw new Exception(); 54 } catch (Exception e) { 55 // TODO: handle exception 56 } 57 58 } 59 60 //错误 处理一个异常后 又抛出了异常 编译不通过 61 public void method3(){ 62 try { 63 throw new Exception(); 64 } catch (Exception e) { 65 throw e; 66 } 67 68 } 69 70 //正确 只要 e 被处理就可以了 71 public void method4(){ 72 try { 73 throw new Exception(); 74 } catch (Exception e) { 75 try { 76 throw e; 77 } catch (Exception e2) { 78 // TODO: handle exception 79 } 80 } 81 82 } 83 84 //错误 没有catch 或则 throws 就是没有处理 编译 不通过 , 85 public void method5(){ 86 try { 87 throw new Exception(); 88 }finally{ 89 //关闭资源 产生的异常 有调用者处理 90 } 91 } 92 93 }