• Java异常处理


    目录

    一、异常

    1、异常的体系结构

    2、从程序执行过程,看编译时异常和运行时异常

    3、常见的异常类型

     二、异常的处理

     1、Java异常处理的抓抛模型

    2、异常处理方式一:try-catch-finally

    3、异常处理方式二:throws + 异常类型

    4、对比两种处理方式

    5.、体会开发中应该如何选择两种处理方式?

    三、手动抛出异常对象

    1、throw 和  throws区别

    2、示例代码

    四、自定义异常


    一、异常

    1、异常的体系结构

    1.   java.lang.Throwable
    2.          |-----java.lang.Error:一般不编写针对性的代码进行处理。
    3.           |-----java.lang.Exception:可以进行异常的处理
    4.               |------编译时异常(checked)
    5.                       |-----IOException
    6.                           |-----FileNotFoundException
    7.                       |-----ClassNotFoundException
    8.               |------运行时异常(unchecked,RuntimeException)
    9.                       |-----NullPointerException
    10.                       |-----ArrayIndexOutOfBoundsException
    11.                       |-----ClassCastException
    12.                       |-----NumberFormatException
    13.                      |-----InputMismatchException
    14.                      |-----ArithmeticException

    2、从程序执行过程,看编译时异常和运行时异常

    编译时异常:执行javac.exe命令时,可能出现的异常
    运行时异常:执行java.exe命令时,出现的异常

    3、常见的异常类型

    1. //******************以下是运行时异常***************************
    2. //ArithmeticException 出现异常的运算条件
    3. @Test
    4. public void test6(){
    5. int a = 10;
    6. int b = 0;
    7. System.out.println(a / b);
    8. }
    9. //InputMismatchException
    10. @Test
    11. public void test5(){
    12. Scanner scanner = new Scanner(System.in);
    13. int score = scanner.nextInt();
    14. System.out.println(score);
    15. scanner.close();
    16. }
    17. //NumberFormatException
    18. @Test
    19. public void test4(){
    20. String str = "123";
    21. str = "abc";
    22. int num = Integer.parseInt(str);
    23. }
    24. //ClassCastException
    25. @Test
    26. public void test3(){
    27. Object obj = new Date();
    28. String str = (String)obj;
    29. }
    30. //IndexOutOfBoundsException
    31. @Test
    32. public void test2(){
    33. //ArrayIndexOutOfBoundsException
    34. // int[] arr = new int[10];
    35. // System.out.println(arr[10]);
    36. //StringIndexOutOfBoundsException
    37. String str = "abc";
    38. System.out.println(str.charAt(3));
    39. }
    40. //NullPointerException
    41. @Test
    42. public void test1(){
    43. // int[] arr = null;
    44. // System.out.println(arr[3]);
    45. String str = "abc";
    46. str = null;
    47. System.out.println(str.charAt(0));
    48. }
    49. //******************以下是编译时异常***************************
    50. @Test
    51. public void test7(){
    52. File file = new File("hello.txt");
    53. FileInputStream fis = new FileInputStream(file);
    54. int data = fis.read();
    55. while(data != -1){
    56. System.out.print((char)data);
    57. data = fis.read();
    58. }
    59. fis.close();
    60. }

     二、异常的处理

     1、Java异常处理的抓抛模型

    过程一:"抛":程序在正常执行的过程中,一旦出现异常,就会在异常代码处生成一个对应异常类的对象,并将此对象抛出。 一旦抛出对象以后,其后的代码就不再执行。

    关于异常对象的产生:

    1. 系统自动生成的异常对象
    2. 手动的生成一个异常对象,并抛出(throw)

     过程二:"抓":可以理解为异常的处理方式:① try-catch-finally  ② throws

    2、异常处理方式一:try-catch-finally

    1. try{
    2.           //可能出现异常的代码
    3.   
    4.   }catch(异常类型1 变量名1){
    5.           //处理异常的方式1
    6.   }catch(异常类型2 变量名2){
    7.           //处理异常的方式2
    8.   }catch(异常类型3 变量名3){
    9.           //处理异常的方式3
    10.   }
    11.   ....
    12.   finally{
    13.           //一定会执行的代码
    14.   }
    15.   

     使用说明: 

    • finally是可选的
    • 使用try将可能出现异常代码包装起来,在执行过程中,一旦出现异常,就会生成一个对应异常类的对象,根据此对象的类型,去catch中进行匹配
    •  一旦try中的异常对象匹配到某一个catch时,就进入catch中进行异常的处理。一旦处理完成,就跳出当前的try-catch结构(在没写finally的情况),继续执行其后的代码
    • catch中的异常类型如果没子父类关系,则谁声明在上,谁声明在下无所谓。如果满足子父类关系,则要求子类一定声明在父类的上面。否则,报错。
    • 在try结构中声明的变量,在出了try结构以后,就不能再被调用。
    • try-catch-finally结构可以嵌套

    常用的异常对象处理的方式: ① String  getMessage()    ② printStackTrace()

    总结:如何看待代码中的编译时异常和运行时异常?

    1. 使用try-catch-finally处理编译时异常,是得程序在编译时就不再报错,但是运行时仍可能报错。相当于我们使用try-catch-finally将一个编译时可能出现的异常,延迟到运行时出现。
    2. 开发中,由于运行时异常比较常见,所以我们通常就不针对运行时异常编写try-catch-finally了。针对于编译时异常,我们说一定要考虑异常的处理。

    finally的再说明:

    1. finally中声明的是一定会被执行的代码。即使catch中又出现异常了,try中return语句,catch中return语句等情况。
    2. 像数据库连接、输入输出流、网络编程Socket等资源,JVM是不能自动的回收的,我们需要自己手动的进行资源的释放。此时的资源释放,就需要声明在finally中。

    3、异常处理方式二:throws + 异常类型

    "thros + 异常类型"写在方法的声明处。指明此方法执行时,可能会抛出的异常类型。一旦当方法体执行时,出现异常,仍会在异常代码处生成一个异常类的对象,此对象满足throws后的异常类型时,就会被抛出。异常代码后续的代码,就不再执行!

    方法重写的规则之一:子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型。

    4、对比两种处理方式

    • try-catch-finally:真正的将异常给处理掉了。
    • throws的方式只是将异常抛给了方法的调用者。并没真正将异常处理掉。  

    5.、体会开发中应该如何选择两种处理方式?

    1. 如果父类中被重写的方法没有throws方式处理异常,则子类重写的方法也不能使用throws,意味着如果子类重写的方法中有异常,必须使用try-catch-finally方式处理。
    2. 执行的方法a中,先后又调用了另外的几个方法,这几个方法是递进关系执行的。我们建议这几个方法使用throws的方式进行处理。而执行的方法a可以考虑使用try-catch-finally方式进行处理。

    三、手动抛出异常对象

    在程序执行中,除了自动抛出异常对象的情况之外,我们还可以手动的throw一个异常类的对象。

    1、throw 和  throws区别

    • throw 表示抛出一个异常类的对象,生成异常对象的过程。声明在方法体内。
    • throws 属于异常处理的一种方式,声明在方法的声明处。

    2、示例代码

    1. class Student{
    2.     
    3.     private int id;
    4.     
    5.     public void regist(int id) throws Exception {
    6.         if(id > 0){
    7.             this.id = id;
    8.         }else{
    9.             //手动抛出异常对象            
    10. throw new RuntimeException("您输入的数据非法!");
    11.         }
    12.         
    13.     }
    14.     @Override
    15.     public String toString() {
    16.         return "Student [id=" + id + "]";
    17.     }
    18. }

    四、自定义异常

    1. 继承于现的异常结构:RuntimeException 、Exception
    2. 提供全局常量:serialVersionUID
    3. 提供重载的构造器
    1.  public class MyException extends Exception{
    2.     
    3.     static final long serialVersionUID = -7034897193246939L;
    4.     
    5.     public MyException(){
    6.         
    7.     }
    8.     
    9.     public MyException(String msg){
    10.         super(msg);
    11.     }
    12. }

     

  • 相关阅读:
    润开鸿与蚂蚁数科达成战略合作,发布基于鸿蒙的mPaaS移动应用开发产品
    macbook桌面文件丢失
    Docker配置与使用
    02-为什么dex文件比class文件更适合移动端?
    bootstrap学习:自定义栅格系统
    为什么在springboot中使用thymeleaf无法实现网络请求
    spring---第一篇
    node.js 用 xml2js.Parser 读 Freeplane.mm文件,生成测试用例.csv文件
    c++ MFC CString 字符串转BYTE数组
    TCP和UDP的区别与联系以及网络字节序和主机字节序的转换函数实践
  • 原文地址:https://blog.csdn.net/qq_51409098/article/details/126290699