异常

2.异常

2.1异常的介绍

Java中所有的异常都是类,可以去API帮助文档寻找

2.2异常体系

 

2.2.1Error

严重级别的问题

常见的有栈、堆内存溢出

通常是硬件问题,性能不足

2.2.2Exception

1.RuntimeException

编译阶段不报错, 运行的时候才出错.

一般为程序员编写代码时粗心大意

2.除RuntimeException以外

特点: 代码语法正确, 但是编译就是报错

作用:起到提醒作用, 告知使用者这段代码很有可能出错,需要我们对问题给出预处理方案, 将来出现问题, 直到怎么解决.

2.3异常的处理方式

2.3.1抛出异常(默认处理流程)

1.执行流程

  1. 虚拟机会在出现异常的代码那里自动的创建一个异常对象:ArithmeticException

  2. 异常会从方法中出现的点这里抛出给调用者,调用者最终抛出给JVM虚拟机

  3. 虚拟机接收到异常对象后,先在控制台直接输出异常信息数据

  4. 直接从当前执行的异常点停掉当前程序

  5. 后续代码没有机会执行了,因为程序已经停止了

2.格式

异常处理方式1 —— try…catch…

  • 监视捕获异常,用在方法内部,可以将方法内部出现的异常直接捕获处理。

  • 这种方式还可以,发生异常的方法自己独立完成异常的处理,程序可以继续往下执行。

 try{// 监视可能出现异常的代码!
}catch(异常类型1 变量){
    // 处理异常
}catch(异常类型2 变量){
    // 处理异常
}...

//Exception可以捕获处理一切异常类型!
try{
   // 可能出现异常的代码!
}catch (Exception e){
   e.printStackTrace(); // 直接打印异常栈信息
}

异常处理方式2 —— throws

  • throws:用在方法上,可以将方法内部出现的异常抛出去给本方法的调用者处理。

  • 这种方式并不好,发生异常的方法自己不处理异常,如果异常最终抛出去给虚拟机将引起程序死亡。

//第一种
方法 throws 异常1 ,异常2 ,异常3 ..{
}

//第二种
//代表可以抛出一切异常
方法 throws Exception{
}

异常处理方式3 —— 前两者结合

  • 方法直接将异通过throws抛出去给调用者。

  • 调用者收到异常后直接捕获处理。

3.使用场景

两种异常处理方式的选择思路

如果是面向用户,那应该使其不可见,选择try…catch…

如果是面向开发人员,防止其提供的数据有误,应该使其可见,选择throws

4.throw和throws

  • throw后面跟的是一个异常类的对象,将异常类对象抛出

  • throws后面跟的是异常类的名字,表示声明,这个方法中可能会出现这些异常;throws后面可以写多个异常类的名字,中间用","隔开

  • 若throw后面跟的是RunTimeException对象及其子类,方法后面可以不用写throws

5.抛出的异常类型细节

2.3.2捕获异常

1.格式

快捷键 Ctrl+Alt+T

 

try {可能会出现异常的代码
} catch(异常类型1 变量) {
处理异常的方案
} catch(异常类型2 变量) {
处理异常的方案
}

 

2.执行流程

public static void main(String[] args) {
   try {
       int[] arr = null;
       System.out.println(arr[0]);
       System.out.println(10 / 0);
       System.out.println("看看我执行了吗?");
  } catch (NullPointerException e) {          // NullPointerException e = new NullPointerException();
       System.out.println("捕获了空指针异常...");
  } catch (ArithmeticException e) {
       System.out.println("捕获了运算异常...");
  }
   System.out.println("后续代码...");
}
/*
       异常的两种处理方式:

           1. 抛出异常
           2. try...catch捕获异常 √

       格式:
           try {
               可能会出现异常的代码
           } catch (异常类名 对象名) {
               异常的处理方案;
           }

       好处: 程序不会崩溃, 后续代码可以继续执行.

       执行流程:
           1. 执行try {} 中的代码, 看是否有问题产生
           2. 有: 由catch负责捕获异常, 执行异常处理方案, 后续代码继续执行
           3. 没有: 不执行catch内部的逻辑, 代码继续执行

       细节补充:
           1. 如果try语句中有多个异常, 后面可以跟多个catch
           2. 如果编写了多个catch, 最大的异常一定要放最后
           3. JDK7版本开始catch中可以编写多个异常类名, 中间使用 | 进行分隔
    */

2.4Throwable类的常见方法

1.printStackTrace

展示异常错误信息(位置, 异常类名, 原因)

2.toString

异常的简单描述(异常类名, 原因)

3.getMessage

异常的简单描述(原因)

2.3自定义异常

2.3.1自定义异常的必要

  • 更好地描述异常情况:通过自定义异常,我们可以为特定的异常情况提供更准确和详细的描述,使得异常处理更加精确和可读性更高。

  • 更好地区分异常类型:自定义异常可以帮助我们区分不同的异常类型,根据不同的异常类型做出不同的处理,提高程序健壮性和可维护性。

2.3.2自定义异常的分类

1.自定义编译时的异常

  • 定义一个异常类继承Exception.
  • 重写构造器。(自定义类想编写方法,就需要重写构造器)
  • 在出现异常的地方用throw new 自定义对象抛出,
    public class StudentAgeException extends Exception {
    //空参构造
       public StudentAgeException() {
      }
    //带参构造
       public StudentAgeException(String message) {
           //父类
           super(message);
      }
    }

     

作用:编译时异常是编译阶段就报错,提醒更加强烈,一定需要处理!

2.自定义运行时的异常

  • 定义一个异常类继承RuntimeException.
  • 重写构造器。
  • 在出现异常的地方用throw new 自定义对象抛出!
    public class StudentAgeException extends RuntimeException {

       public StudentAgeException() {
      }

       public StudentAgeException(String message) {
           super(message);
      }
    }

     

作用:提醒不强烈,编译阶段不报错!!运行时才可能出现!!

posted @   灵泽pro  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示