Java之异常 旧城等待, 2024-03-31 11:45 8阅读 0赞 **目录** 1.异常的概念和体系结构 1.1概念 1.1.1算术异常 1.1.2 数组越界异常 1.1.3空指针异常 1.2体系结构 1.3 分类 2.异常的处理 2.1防御式异常 2.2抛出(一次只能抛一个异常) 2.3捕获 2.3.1声明throws 2.3.2try-catch捕获并处理 2.3.3finally 2.4 异常的处理流程 -------------------- ## 1.异常的概念和体系结构 ## ### 1.1概念 ### 在Java中,将程序执行过程中发生的不正常行为称为异常 #### 1.1.1算术异常 #### System.out.println(5%0); 运行结果 ![2ceb7df935dd40acb935f3e2af6d1577.png][] #### 1.1.2 数组越界异常 #### char[] arr={'a','b','c','d'}; System.out.println(arr[10]); 运行结果 ![ed0ab4b2cf37492188962231e800b510.png][] #### 1.1.3空指针异常 #### char[] array=null; System.out.println(array); 运行结果 ![6ae78519775242e1afea08223ff3e47e.png][] ### 1.2体系结构 ### ![0807af4b3fe1410dbf18a88abaeed689.png][] 说明: 1. Throwable:是异常体系的顶层类,其派生出两个重要的子类, Error 和 Exception 2. Error:指的是Java虚拟机无法解决的严重问题 3. Exception:异常产生后程序员可以通过代码进行处理,使程序继续执行 ### 1.3 分类 ### 1编译时异常(编译时的错误) 在程序编译期间发生的异常,称为编译时异常,也称为受检查异常(Checked Exception) IOException ,ClassNotFoundException ,ClonNotSupportedException 2.运行时异常(已经通过编译,在JVM运行时的错误) 在程序执行期间发生的异常,称为运行时异常,也称为非受检查异常(Unchecked Exception) 注意:编译时出现的语法性错误,不能称之为异常 RuntimeException ## 2.异常的处理 ## ### 2.1防御式异常 ### 1.事前防御 int a=1 if (a!=1) { 处理错误; return; } 缺点:代码混在一起,不容易理解代码 2.事后解决 try{ func(); }catch(func()异常){ 处理func()异常; } 优点:代码分开,容易理解代码 ### 2.2抛出(一次只能抛一个异常) ### 用throw关键字,抛出一个指定的异常对象,将错误信息告知给使用者 语法: > throw new ...Exception("原因"); int[] array = {1,2,3}; if(array[10]!=0){ throw new ArrayIndexOutOfBoundsException("传递的数组下标越界"); } System.out.println("1"); 运行结果 ![f1be8032824e483bb8061e410137772f.png][] 说明: 1.throw必须在方法体内 2. 抛出的对象必须是Exception 或者 Exception 的子类对象 3. 如果抛出的是 RunTimeException 或者 RunTimeException 的子类,由JVM处理 4.异常一旦抛出,其后的代码就不会执行 ### 2.3捕获 ### #### 2.3.1声明throws #### 可以借助throws将异常抛给方法的调用者来处理 > 修饰符 返回值类型 方法名(参数列表) throws 异常类型1,异常类型2...\{ \} public static double func()throws ArithmeticException { if((5%0) !=0){ new throw ArithmeticException(); } 说明: 1.throws必须跟在方法的参数列表之后 2.声明的异常必须是 Exception 或者 Exception 的子类 3. 方法内部如果抛出了多个异常,throws之后必须跟多个异常类型,之间用逗号隔开,如果抛出多个异常类型具有父子关系,直接声明父类即可。 #### 2.3.2try-catch捕获并处理 #### > try\{ > > // 将可能出现异常的代码放在这里 > > \}catch(要捕获的异常类型 e)\{ > > // 如果try中的代码抛出异常了,此处catch捕获时异常类型与try中抛出的异常类型一致时,或者是try中抛出异常的基类 时,就会被捕获到 > > \}catch(异常类型 e)\{ > > // 对异常进行处理 > > \} public static void main(String[] args) { try { func(); } catch (ArrayIndexOutOfBoundsException e) { e.printStackTrace(); } } public static void func() { char[] array = {'a','b','v'}; System.out.println(array[10]); } #### 2.3.3finally #### 不论程序是否发生异常,都需要执行,用于对资源进进行回收 > try\{ > > // 可能会发生异常的代码 > > \}catch(异常类型 e)\{ > > // 对捕获到的异常进行处理 > > \}finally\{ > > // 此处的语句无论是否发生异常,都会被执行到 > > \} // 如果没有抛出异常,或者异常被捕获处理了,这里的代码也会执行 public static double func() { int a = 1; try { double b = 5 % a; return b; } catch (ArithmeticException e) { e.printStackTrace(); } finally { System.out.println("finally中代码"); } System.out.println("try-catch-finally之后代码"); return 0; } public static void main(String[] args) { double c=func(); System.out.println(c); } } 运行结果 > finally中代码 > 0.0 如果正常输出后程序返回,try-catch-finally之后的代码根本就没有执行,可能会造成资源泄漏,所以这个时候就需要finally语句,finally语句一定会被执行,用于对资源的扫尾工作。 ### 2.4 异常的处理流程 ### 如果方法中没有合适的处理异常的方式, 就会沿着调用栈向上传递 public class Test2 { public static void main(String[] args) { try { func(); } catch (ArrayIndexOutOfBoundsException e) { e.printStackTrace(); } System.out.println("try catch之后执行的代码"); } public static void func() { char[] array = {'a','b','v'}; System.out.println(array[10]); } } 运行结果 ![f7cba9c091564bddb34575b33a42d8db.png][] 先在func中处理,但是func中没有处理,然后向上传递,交给main处理 那如果main没有处理会怎么样? public class Test2 { public static void main(String[] args) { func(); System.out.println("try catch之后执行的代码"); } public static void func() { char[] array = {'a','b','v'}; System.out.println(array[10]); } } 运行结果 ![b0402f6546384bcdb3b7c50bcf32d5e5.png][] 可以看到运行终止了,没有执行到System.out.println("try catch之后执行的代码");这一行,所以main方法也没有处理时,会交给JVM处理,JVM会直接中断。 说明: ![12d9619f3d324b88beec0928b91deab6.png][] [2ceb7df935dd40acb935f3e2af6d1577.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/31/f4010242921f449497cee8a5fdbdbb49.png [ed0ab4b2cf37492188962231e800b510.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/31/29c161a5a3984fd3b4f57732b80c3df9.png [6ae78519775242e1afea08223ff3e47e.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/31/04a7e757d9a94869994ac2b10e94e9e1.png [0807af4b3fe1410dbf18a88abaeed689.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/31/8baa20f5185b427fa9f6c1851661310c.png [f1be8032824e483bb8061e410137772f.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/31/c8a88707720343daa9585699a4202000.png [f7cba9c091564bddb34575b33a42d8db.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/31/d244f6b308cd476cbb0710a5bfa654a0.png [b0402f6546384bcdb3b7c50bcf32d5e5.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/31/4a7ce9d94a094918a8b10a2eaa634670.png [12d9619f3d324b88beec0928b91deab6.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/31/54ec011533bd4addb8db8db134030ecf.png
还没有评论,来说两句吧...