java中的运行时异常和编译时异常的不同

文章通过代码示例对比了Java中的运行时异常和编译时异常。运行时异常在不捕获的情况下可以由JVM处理,而编译时异常则需要程序员在编译阶段进行捕获或声明。不捕获编译时异常会导致编译失败。这种设计使得程序员必须关注可能出现的编译时异常,而运行时异常通常与编程错误有关,不强制处理。
摘要由CSDN通过智能技术生成

异常分为 运行时异常 和 编译时异常。

所谓编译时异常其实就是异常中出运行时异常及其子类以外的异常。

今天来探讨一下 运行时异常 和 编译时异常 的一些不同点,先看代码

我们先写一个常见的异常
定义Conunt类

public class Count {
    public  static int count(int a,int b){
        return a/b;
    }
}

很明显当b=0时会出现异常
再写测试类Test


public class Test {
    public static void main(String[] args) {
       
        System.out.println("异常前");
        System.out.println(Count.count(10,0));
        System.out.println("异常后");
}
}

程序运行后会抛异常

我们再写自定义一个继承 运行时异常 的 自定义异常用来比较
运行时异常和编译时异常的不同

public class ZeroException extends RuntimeException {
    public ZeroException() {
    }

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

}

这时修改 Count类

public class Count {
    public  static int count(int a,int b){
    if(b==0){
    throw new ZeroException("自己写的异常");
    }
        return a/b;
    }
}

运行程序,结果

异常前
Exception in thread "main" ZeroException: 自己写的异常
	at Count.count(Count.java:4)
	at Test.main(Test.java:8)

异常抛至jvm,程序停止运行

然后我们再修改ZeroException类,使其继承ClassNotFoundException,变成编译时异常

再运行

C:\Users\hhhh\Documents\tools_idea\Test\src\Count.java:4:13
java: 未报告的异常错误ZeroException; 必须对其进行捕获或声明以便抛出

会发现他会让你必须对Count类里的异常进行声明或捕获,这就是运行时异常和编译时异常的不同

运行时异常写不写异常声明或捕获都不强制,可写可不写。

如果既不写声明,又不写捕获,他就自动往上报,直至jvm,终止程序。

如果只写声明,无非就是往上抛异常,但值得一提的是如果声明的是运行时异常,只要是运行时异常,似乎抛出的异常与声明的异常不相符是可以的。

如修改Count类

public class Count {
    public  static int count(int a,int b)throws ArithmeticException {
        if(b==0){
            throw new ZeroException("自己写的异常");
        }
        return a/b;
    }
}

抛出异常与声明异常不相符,但行得通,运行结果

异常前
Exception in thread "main" ZeroException: 自己写的异常
	at Count.count(Count.java:6)
	at Test.main(Test.java:8)

但如果声明是编译时异常,如

public class ZeroException extends ClassNotFoundException {
    public ZeroException() {
    }

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

}

ClassNotFoundException是一个编译时异常

结果

java: 未报告的异常错误java.lang.ClassNotFoundException; 
必须对其进行捕获或声明以便抛出

告诉我在Test类中有未报告的异常,必须对 ClassNotFoundException 进行捕获或声明以便抛出。
这就体现了 系统对 编译时异常出现 应对措施的强制性。

为什么写java的人要这样做,查询资料,发现

运行时异常是不可查的,因为他在应用程序程序的控制和处理能力之外,而且绝大多数是程序运行时不运行出现的状况,程序设计者无能为力,因此不必处理他们,不要求强制处置。

所以编译时异常 系统会要求你强制处置,与 运行时异常 不同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值