异常分为 运行时异常 和 编译时异常。
所谓编译时异常其实就是异常中出运行时异常及其子类以外的异常。
今天来探讨一下 运行时异常 和 编译时异常 的一些不同点,先看代码
我们先写一个常见的异常
定义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的人要这样做,查询资料,发现
运行时异常是不可查的,因为他在应用程序程序的控制和处理能力之外,而且绝大多数是程序运行时不运行出现的状况,程序设计者无能为力,因此不必处理他们,不要求强制处置。
所以编译时异常 系统会要求你强制处置,与 运行时异常 不同。