1 package com.fu.java5; 2 3 import org.junit.jupiter.api.Test; 4 5 /** 6 * 一、异常的处理;抓抛模型 7 * 过程一:“抛” :程序在正常执行的过程中,一旦出现异常,就会在异常代码出生成一个对应异常的对象。 8 * 并将此对象抛出。 9 * 一旦抛出对象以后,其后的代码就不在执行。 10 * 关于异常对象的产生:① 系统自动生成的异常对象 11 * ② 手动生成异常对象并抛出(throw) 12 * 13 * 过程二:“抓” :可以理解为异常的处理方式:①try-catch-finally ② throws 14 * 15 * 二、try-catch-finally的使用 16 * try{ 17 * //可能出现异常的代码 18 * 19 * }catch(异常类型1 变量名1){ 20 * //处理异常的方式1 21 * }catch(异常类型2 变量名2){ 22 * //处理异常的方式2 23 * }catch(异常类型3 变量名3){ 24 * //处理异常的方式3 25 * } 26 * .... 27 * finally{ 28 * //将一定会执行的代码放在这里 29 * } 30 * 31 * 说明: 32 * 1.finally是可选的。 33 * 2.使用try将可能出现异常的代码包装起来,在执行过程中,一旦出现异常,就会生成一个对应异常类的对象,根据此对象的类型,据此 34 * 对象的类型,去catch中进行匹配。 35 * 3.一旦try中的异常对象匹配到某一个catch时,就进入catch中进行处理。一旦处理完成,就跳出 36 * 前的try-catch结构(在没有写finally的情况)。继续执行其后的代码 37 * 4.catch中的异常类型如果没有子父类关系,则谁声明在上,谁声明在下,无所谓。 38 * catch中的异常类型如果满足子父类关系,则要求子类一定声明在父类上面,否则报错。 39 * 5.常用的异常处理的方式:① String getMessage() ②printStackTrace() 40 * 6.在try结构中声明的变量,在出了try结构以后,就不能再被调用 41 * 42 *体会1:使用try-catch-finally处理编译时异常,使得程序再编译时就不再报错,但是运行时仍可能报错,相当于我们使用try-catch--finally结构 43 * 将一个编译可能出现异常的结构延迟到运行时出现。 44 * 体会2:开发中,由于运行时异常比较常见,所以我们通常就不针对运行时异常编写try-catch-finally了。 45 * 针对编译时异常,我们就一定要考虑异常的处理。 46 */ 47 public class ExceptionTest1 { 48 @Test 49 public void test1(){ 50 int[] arr = null; 51 try { 52 System.out.println(arr[3]); 53 System.out.println("hello----1"); 54 }catch (NullPointerException e){ 55 // System.out.println("出现空指针异常,不要着急..."); 56 //String getMessage(); 57 // System.out.println(e.getMessage()); 58 //printStackTrace 59 e.printStackTrace(); 60 }catch(NumberFormatException e){ 61 System.out.println("出现数值转换异常,不要着急..."); 62 }catch(Exception e){ 63 System.out.println("出现异常,不要着急..."); 64 } 65 System.out.println("hello----2"); 66 67 } 68 }
1 package com.fu.java5; 2 3 import org.junit.jupiter.api.BeforeEach; 4 import org.junit.jupiter.api.Test; 5 6 /** 7 * try-catch-finally中finally的使用: 8 * 1.finally是可选的 9 * 2.finally中声明的是一定会被执行的代码。即使catch中又出现异常了,try中有return语句,catch中有return语句等情况。 10 * 3.像数据库连接、输入输出流、网络编程Socket等资源,JVM是不能自动回收的,我们需要自己手动的进行资源的释放,此时的 11 * 资源释放,就需要声明在finally中。 12 * 13 * 14 */ 15 public class FinallyTest { 16 17 @Test 18 public void test2(){ 19 System.out.println(); 20 } 21 22 @Test 23 public void test1(){ 24 try { 25 int a = 10; 26 int b = 0; 27 System.out.println(a/b); 28 }catch (ArithmeticException e){ 29 e.printStackTrace(); 30 }finally { 31 System.out.println("hello"); 32 } 33 } 34 }