【详细+超基础】Java-学习笔记 12

在这里插入图片描述

【详细+超基础】Java-学习笔记

Java学习笔记系列——孙不坚1208
【详细+超基础】Java-学习笔记 01
【详细+超基础】Java-学习笔记 02
【详细+超基础】Java-学习笔记 03
【详细+超基础】Java-学习笔记 04
【详细+超基础】Java-学习笔记 05
【详细+超基础】Java-学习笔记 06
【详细+超基础】Java-学习笔记 07
【详细+超基础】Java-学习笔记 08
【详细+超基础】Java-学习笔记 09
【详细+超基础】Java-学习笔记 10
【详细+超基础】Java-学习笔记 11
【详细+超基础】Java-学习笔记 12
【详细+超基础】Java-学习笔记 13
【详细+超基础】Java-学习笔记 14
【详细+超基础】Java-学习笔记 15
Java学习笔记系列持续更新中…

八、异常

异常:

指的是程序在执行过程中,出现的非正常的情况,最终导致JVM的非正常停止,在Java中,异常本身是一个类,产生异常就是创建异常对象并抛出一个异常对象,Java处理异常的方式是中断处理。

异常的基本语法

1.处理异常的语法:
 try{
     // 可能出现异常的代码
 } catch(参数:异常的类型 e) {
     // 捕获try当中可能出现的异常
 } finally {
     // 异常的出口(必然会执行的语句)
 }

总结:

  1. 在 catch 块中,一定要捕获相对应的异常,如果程序抛出的异常在catch 块当中,不能被捕获,那么就会交给 JVM 处理。

  2. 可以通过catch 捕获多个异常。 例如:

         public static void main(String []args) {
             try{
                 int [] array = {1,2,3};
                 System.out.println(array[3]); 
             }catch(NullPointerException e) {
                 e.printStackTrace();
                 System.out.println("捕获了空指针异常")
             } catch(ArrayIndexOutOfBoundsException e) {
                 e.printStackTrace();
                 System.out.println("捕获了数组越界异常")
             }
         }
    
  3. 不建议直接捕获一个 Exception 的异常

  4. 可以用 | 同时处理两个异常。 例如:catch( NullPointerException |ArrayIndexOutOfBoundsException ){ }

  5. finally 的特性:不管这个代码是否抛出异常,finally 的内容都会被执行。所以 finally 经常来做一些善后的内容。比如:关闭资源

  6. catch和finally根据情况选择加与不加

2.异常处理流程
  • 程序先执行try中的代码
  • 如果try中的代码出现异常,就会结束try中的代码,看和catch中的异常类型是否匹配.
  • 如果找到匹配的异常类型,就会执行catch中的代码
  • 如果没有找到匹配的异常类型,就会将异常向上传递到上层调用者.
  • 无论是否找到匹配的异常类型, finally 中的代码都会被执行到(在该方法结束之前执行)
  • 如果上层调用者也没有处理的了异常,就继续向上传递.
  • 一直到main方法也没有合适的代码处理异常,就会交给jVM来进行处理,此时程序就会异常终止…
3.抛出异常
  • 除了 Java 内置的类会抛出一些异常之外, 我们可以手动抛出某个异常. 使用 throw 关键字完成这个操作。
  • throw 一般抛出一个你想要抛出的异常(或者自定义的异常)
(1)throw的使用
 public static int devide (int x,int y) {
     if(y==0) {
         throw new ArithmeticException("y==0");
     }
     return x/y;
 } 
 public static void main(String []args) {
     devide (10,0);
 }
 //  我们用 throw new 了一个算数异常,因为算数异常本身也是一个类,所以需要实例化。
 结果:
     Exception in thread "main" java.lang.ArithmeticException: y==0
         at exception.demo.devide(demo.java:6)
         at exception.demo.main(demo.java:11)   
 //  成功的抛出异常了,但是这样写有一个不好的地方。我们抛出了一个异常但是呢,这个异常我们只是抛出了但是并未处理,所以最后程序出现异常后交给JVM处理,程序最后终止。    
(2)异常的声明

对于上例,如果 devide 方法的内容很多,我们就看不出 devide 会抛出一个异常。那么为了让调用devide 方法的人知道,我们调用这个方法会抛出这个异常,一般情况下,我们会给这个方法进行声明异常。

声明异常:我们在处理异常的时候,通常希望知道这段代码中究竟会出现哪些可能的异常,我们可以使用throws关键字,把可能抛出的异常名字标注在方法定义的位置,从而提醒调用者注意捕获这些异常.

 // 通过throws 声明这个方法会抛出一个异常
 public static int devide (int x,int y)throws ArithmeticException{
     if (y==0) {
         throw new ArithmeticException("y==0");
     }
     return x/y;
 }
 public static void main(String []args) {
     try {
         devide(10,0);
     }catch(ArithmeticExcetion e) {
         e.printStackTrace();
         System.out.println("捕获了算数异常");
     }finally{
         System.out.println("这是finally代码块的语句一定会被执行");
     }
 }
 // 方法调用者知道了调用该方法可能会抛出算数异常,就用上了 try…catch 来捕获异常。
 结果:
     java.lang.ArithmeticException: y==0
     捕获了算数异常
     这是finally代码块的语句一定会被执行
     at exception.demo.devide(demo.java:6)
     at exception.demo.main(demo.java:12)
 ​

Java异常体系

  • A: 异常的继承体系 Throwable: 它是所有错误与异常的超类(祖宗类) |- Error 错误 |- Exception 编译期异常,进行编译JAVA程序时出现的问题 |- RuntimeException 运行期异常, JAVA程序运行过程中出现的问题

    B:异常与错误的区别

     a:异常
     * 指程序在编译、运行期间发生了某种异常(XxxException),我们可以对异常进行具体的处理。
     * 若不处理异常,程序将会结束运行。
     * 案例:
       public static void main(String[] args) {
         int[] arr = new int[3];
         System.out.println(arr[0]);
         System.out.println(arr[3]);
         // 该句运行时发生了数组索引越界异常ArrayIndexOutOfBoundsException,由于没有处理异常,导致程       序无法继续执行,程序结束。
         System.out.println("over"); // 由于上面代码发生了异常,此句代码不会执行
       }
     ​
     b:错误
        * 指程序在运行期间发生了某种错误(XxxError),Error错误通常没有具体的处理方式,程序将会结束运行。
        * Error错误的发生往往都是系统级别的问题,都是jvm所在系统发生的,并反馈给jvm的。
        * 我们无法针对处理,只能修正代码。
        * 案例演示:
          public static void main(String[] args) {
             int[] arr = new int[1024*1024*100];
             //该句运行时发生了内存溢出错误OutOfMemoryError,开辟了过大的数组空间,
             //导致JVM在分配数组空间时超出了JVM内存空间,直接发生错误。
          }
    

自定义异常

Java 中虽然已经内置了丰富的异常类, 但是我们实际场景中可能还有一些情况需要我们对异常类进行扩展, 创建符合自己实际情况的异常.

我们来实现一个简单的自定义的异常类

首先 我们要自定义一个异常类 同时继承一个父类异常

 class MyException extends Exception {
     public MyException() {
         super();
     }
     public MyException(String message) {
         super(message); 
     }
 }

案例:

 class MyException extends Exception {
     public MyException() {
         super();
     }
     public MyException(String message) {
         super(message); 
     }
 }
 public static void test(int x)throws MyException{
     if (x==1) {
         throw new MyException("抛出自定义异常");
     }
 }
 public static void main (String []args) {
     try {
         test(1);
     }catch (MyException e){
         e.printStackTrace();
         System.out.println("捕获了自定义异常")
     }
 }
 结果:
     exception.MyExcetion: 抛出自定义异常
         捕获了自定义异常
         at exception.demo.test(demo.java:6)
         at exception.demo.main(demo.java:11)
 // 这就是我们自定义异常的使用。

欢迎订阅专栏 请你喝杯java , 希望能给需要帮助的朋友带来方便,同时也希望能得到各位大佬的建议。

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

請你喝杯Java

感谢您的支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值