Java 异常机制

异常机制

代码在实际的敲写中,遇到的情况不可能是完美的。如:写的某个模块,用户输入不一定符合要求,或者说程序要打开某个文件,文件不存在或文件格式不对等等。这种情况我们统称为异常(Exception)。异常如果不处理的话,有可能会影响到程序的正常运行,所以,我们就需要通过,在代码的敲写中,提前预防这种情况的发生,或者说如果异常出现了,程序应该怎么处理。

  • 异常主要分为三种类型:

    • 检查性异常:用户错误或问题引起的异常,程序员无法预见。如要打开一个文件,而文件不存在。
    • 运行时异常:运行时异常是可以被程序员避免的异常,在编译时可以可以被忽略。
    • 错误:错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。
  • Java把异常当作对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类。

  • 异常类分为两大类。错误Error和异常Exception

异常处理机制

  • 抛出异常

  • 捕获异常

  • try用于监控执行的代码,如果有异常,则catch进行捕获异常

public static void main(String[] args) {
        int a =  1;
        int b = 0;

        //try···catch  是必须使用
        try{//监控区域
            System.out.println(a/b);//被监控的执行代码块
        }catch(ArithmeticException e){//catch(要捕获的异常类型!)捕获异常
            System.out.println("程序出现异常,变量b不能为0");
        }
}
  • try{}catch{}必须连着使用,而catch的()中为要捕获的异常类型!
  • 同时,我们可以利用多个catch进行多种异常的捕获!
	try{
            new Test().a();//死循环递归方法
        }catch (Error e){
            System.out.println("程序不能运行");
        }catch (Exception e){
            System.out.println("Exception");
            //通过设置多重异常捕获类型,防止遗漏   从小到大!
        }catch (Throwable e){
            System.out.println("Throwable");
        }	

​ 通过设置多重异常捕获类型,防止有遗漏的异常。由于小的异常被包括到大的异常中,所以捕获的异常类型应由小到大!

  • finally用于处理善后工作
public static void main(String[] args) {
        int a =  1;
        int b = 0;

        //try···catch  是必须使用
        try{//监控区域
            System.out.println(a/b);
        }catch(ArithmeticException e){//catch(要捕获的异常类型!)捕获异常
            System.out.println("程序出现异常,变量b不能为0");
        }

        //之后的IO流,和一些资源,无论有没有使用最后都需要关闭来释放资源
        finally {//处理善后工作   可以不用
            System.out.println("finally");
        }
}

​ finally不论有没有被捕获到异常都会被执行,可以不被使用。而之后的IO流和一些资源,在最后都要关闭来释放,防止资源浪费!

快捷键:Ctrl+Alt+T

throw

  • 主动抛出异常
  • 用在方法体中,后面跟的是异常类对象名
  • 只能抛出一个异常对象名
  • 由方法体内的语句进行处理
public void test(int a,int b)  {

        if (b==0){//若符合条件,则会抛出异常
            throw new ArithmeticException();
        }

    }

​ 如果执行了该语句,无论有没有异常,一定会抛出一个异常,此时就需要再方法体中环绕 try···catch 来进行捕获异常,否则使用 throws进行方法外异常抛出。

throws

  • 跟在方法声明后面,后面跟的是异常类名
  • 可以跟多个异常类名,用逗号隔开
  • 表示抛出异常,调用该方法的使用者要进行异常捕获处理,否则爆红
  • throws表示该方法有出现异常的可能性,不一定会出现异常
 public static void main(String[] args) {
        try {
            new Test3().test1(1,2);
        } catch (Exception e) {
            System.out.println(11);
        }
    }

public void test1(int a,int b) throws Exception{

        System.out.println(a+b);

    }

​ 总的来说,throw写在方法体中,由方法内部去处理会出现的异常,它更像是人为去认定异常。而throws则是把问题丢给了使用方法的使用者,由机器去认定异常的发生,并由使用者去捕获处理异常。

自定义异常

  • 继承父类Exception类
  • 根据异常类型,定义构造方法
  • 打印输出异常信息
public class MyException extends Exception{

    //传递数字
    private int detail;

    //定义构造器
    public MyException(int a) {
        this.detail = a;
    }

    //打印异常的信息
    @Override
    public String toString() {
        return "MyException{" +
                "detail=" + detail +
                '}';
    }
}

​ 这样,一个自定义异常类就定义好了,用法和正常的异常类型一样!

异常实际应用中的经验总结

  • 处理运行时异常时,采用逻辑去合理规避同时辅助 try-catch 处理
  • 在多重catch块后面,可以加一个catch(Exception)来处理可能被遗漏的异常
  • 对于不确定的代码,也可以加上 try-catch,处理潜在的异常
  • 尽量去处理异常,切忌只是简单地调用 printStackTrace() 去打印输出
  • 尽量添加finally语句块去释放占用的资源
posted @   远帆启航  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示