2-0异常体系结构:
|
2-1:定义:
程序在运行期间发生的不正常的情况称之为异常。
2-2:jvm解决异常的方式:
1、终止正在运行程序 2、输出当前异常信息 a、异常的类型 (jdk内部维护了当前异常的一个对象 用当前对象来描述当前出现的异常) b、异常的原因 c、异常可能出现的行数 |
2-3:程序出现异常列子:
1. package com.shsxt.exception; 2. 3. import java.util.Scanner; 4. 5. /* 6. * 用户输入两个数 求两个数的商 7. * java.util.InputMismatchException 8. * 9. * 10. */ 11. public class Test02 { 12. 13. public static void main(String[] args) { 14. 15. 16. Scanner input = new Scanner(System.in); 17. System.out.println("请输入被除数---->"); 18. int num1 = input.nextInt(); 19. System.out.println("请输入除数---->"); 20. 21. //关闭当前的Scanner 22. input.close(); 23. 24. 25. int num2 = input.nextInt(); 26. System.out.println(num1+"/"+num2+"="+(num1/num2)); 27. } 28. } |
报错信息:
|
2-4:通过业务逻辑解决异常的方式:
1. package com.shsxt.exception; 2. 3. import java.util.Scanner; 4. 5. /* 6. * 手动解决异常问题 7. * 8. * 通过大量的if判断解决程序在执行过程中可能出现的异常情况。 9. * 优势:确实可以将异常信息不交由jvm解决 显示更友好的提示信息 10. * 劣势:编写的代码量太大了 而且后期不利于维护 并且程序员永远不知道用户有哪些输入 11. * 12. * 13. * 14. * 15. */ 16. public class Test03 { 17. public static void main(String[] args) { 18. 19. Scanner input = new Scanner(System.in); 20. System.out.println("请输入被除数---->"); 21. 22. //判定一次用户输入的值是不是我们需要的 23. if(input.hasNextInt()){//下一次获取到的值是否是一个int值 如果是返回true 如果不是返回fasle 24. int num1 = input.nextInt(); 25. System.out.println("请输入除数---->"); 26. //判定用户输入 27. if(input.hasNextInt()){ 28. int num2 = input.nextInt(); 29. if(num2!=0){ 30. System.out.println(num1+"/"+num2+"="+(num1/num2)); 31. }else{ 32. System.out.println("除数不能为0"); 33. } 34. }else{ 35. System.out.println("用户输入除数有误"); 36. } 37. }else{ 38. System.out.println("用户输入逇被除数有误"); 39. } 40. } 41. }
|
PS:注意:
1. 通过大量的if判断解决程序在执行过程中可能出现的异常情况。 2. * 优势:确实可以将异常信息不交由jvm解决 显示更友好的提示信息 * 劣势:编写的代码量太大了 而且后期不利于维护 并且程序员永远不知道用户有哪些输入 |
2-5:异常处理方式 try-catch-finally
2-4-1:try-catch
结构:
* 结构: * try{ * 可能出现异常de代码段 * }catch(可能出现的异常){ * 解决办法 * } |
顺序:
* try-catch的执行顺序: * 1、执行try块中的代码块 如果出现异常 * 2、通过出现的异常去匹配 catch中声明的异常类型 * 3、如果匹配成功 执行catch中的代码块 如果匹配失败 jvm处理当前异常信息 (终止程序 输出异常信息) * 4、继续执行剩下的代码 |
例子:
1. public class Test04 { 2. public static void main(String[] args) { 3. try{ 4. int num = 1/0;//new ArithmeticException() 5. System.out.println(num); 6. }catch(InputMismatchException e){ //InputMismatchException e = new ArithmeticException(); 7. System.out.println("除数不能为0"); 8. } 9. 10. System.out.println("嘿嘿"); 11. 12. } 13. } |
注意事项
PS:只能处理一种异常信息。 |
2-4-2:try-多重catch
结构:
* 结构: * try{ * 可能出现异常的代码 * }catch(异常类型1 e1){ * 解决方案1 * }catch(异常类型2 e2){ * 解决方案2 * }catch(异常类型3 e3){ * 解决方案3 * }。。。。{ * } |
顺序
* 执行顺序: * 1、执行try块 如果出现异常 * 2、以此匹配多重catch中声明的异常 * 3、如果匹配成功 执行当前匹配成功的catch块 try-catch块执行完毕 继续执行下面的代码 * 4、如果匹配失败 交由jvm处理 程序终止 输出异常信息 * 5、一般情况下我们都会在最后一个catch中加入Exception 获取可能没有捕获的异常信息 |
例子
1. public class Test05 { 2. public static void main(String[] args) { 3. 4. Scanner input = new Scanner(System.in); 5. 6. try{ 7. System.out.println("请输入被除数---->"); 8. int num1 = input.nextInt(); 9. System.out.println("请输入除数---->"); 10. int num2 = input.nextInt(); 11. System.out.println(num1+"/"+num2+"="+(num1/num2)); 12. 13. }catch(InputMismatchException e){//这个异常对象中没有维护异常的原因 所以通过getMessage获取不到异常信息 null值 14. //e.printStackTrace(); 15. System.out.println(e.getMessage()); 16. System.out.println("用户输入有误"); 17. }catch(ArithmeticException e){//这个异常对象中维护异常的原因 所以通过getMessage可以获取到异常信息 18. System.out.println(e.getMessage());//by zero 19. System.out.println("除数不能为0"); 20. 21. 22. }catch(Exception e){//Exception e = new 可能出现的异常(); 父类变量指向了子类对象 23. //多态 24. System.out.println(e.getMessage()); 25. System.out.println("外星人把页面叼走了 请等待。。。"); 26. } 27. 28. } 29. }
|
注意事项:
PS: 1、 一般情况下我们都会在最后一个catch中加入Exception 获取可能没有捕获的异常信息 2、 常见的异常的对象中的方法: * 异常中常见的方法: * e.getMessage() -->获取异常的原因藐视 * e.printStackTrace() -->打印异常的出现行数以及异常的全限定名* e.toString --> 异常的全限定名 |
2-4-3:try-多重catch-finally
结构:
* 结构: * try{ * 可能出现异常的代码 * }catch(异常类型1 e1){ * 解决方案1 * }catch(异常类型2 e2){ * 解决方案2 * }catch(异常类型3 e3){ * 解决方案3 * }。。。。{ * }finally{ * 代码块 * } |
顺序:
* 执行顺序: * 1、执行try块 如果出现异常 * 2、以此匹配多重catch中声明的异常 * 3、如果匹配成功 执行当前匹配成功的catch块 执行finally代码块 try-catch-finally块执行完毕 继续执行下面的代码 * 4、如果匹配失败 交由jvm处理 程序终止 输出异常信息 也会执行finally代码块 * 5、一般情况下我们都会在最后一个catch中加入Exception 获取可能没有捕获的异常信息 * 6、一般情况下通过finally去关闭连接资源 |
例子:
1. public class Test06 { 2. public static void main(String[] args) { 3. Scanner input = null; 4. try{ 5. 6. input = new Scanner(System.in); 7. System.out.println("请输入被除数---->"); 8. int num1 = input.nextInt(); 9. System.out.println("请输入除数---->"); 10. int num2 = input.nextInt(); 11. System.exit(0);//关闭虚拟机 0正常退出 非0 强制退出 12. System.out.println(num1+"/"+num2+"="+(num1/num2)); 13. 14. }catch(InputMismatchException e){ 15. System.out.println("用户输入有误"); 16. }catch(ArithmeticException e){ 17. System.out.println("除数不能为0"); 18. }catch(Exception e){ 19. System.out.println("外星人把页面叼走了 请等待。。。"); 20. }finally{ 21. 22. System.out.println("我被执行了"); 23. //在这里关闭的 24. input.close(); 25. } 26. 27. } 28. } |
注意事项:
PS: |
1、 finally一定会被执行 return 以及异常或者是正常情况下都会执行finally代码 2、 System.exit(数字) 退出虚拟机 0 正常 非0 强制 |