java程序设计语言提供了三种可抛出结构:受检查时异常(checked exception),运行时(run-time exception)和错误 (error)
java异常:受检查时异常和运行时异常(非编译时异常)
首先介绍一下我们常见的集中描述:受检查时异常,编译异常,非运行时异常 描述可以理解为同一个意思,
运行时异常,非编译时异常,非受检查时异常 等同 // 非受检查的可抛出结构:运行时异常(或者说是非编译时异常)和错误(error)
不要把可抛出结构和可抛出异常混着理解:error和exception类都是继承Throwable类
RunTimeException继承Exception
在决定使用受检的异常或者未受检的异常时,主要的原则是:如果期望调用者能够使当地恢复,对于这种情况就应该使用受检查时异常。
有两种未受检查的可抛出结构:运行时异常和错误,在行为上两者等同的:他们都是补虚药也不应该被捕获的可抛出结构。如果程序抛出未收件的异常或者错误,往往就属于不可恢复的情形,继续执行下去有害无益。如果程序没有捕获到这样的可抛出结构,讲会导致当前线程停止,并出现适当的错误消息。
运行时异常:RunTimeException
受检查异常:Exception
编译时异常要么加throws 要么加try…catch,不像运行时异常一样可以什么都不加,因为运行时异常只有运行到他的时候才能发现的错误,在编译期跟正常代码一样所以不会强制加这些,但是编译时异常在你编译的时候已经发现了有可能的错误情况会强制你添加异常处理(要么交给虚拟机或者线程,要么自己处理)
各举例子
运行时异常:
package my;
import javax.management.RuntimeErrorException;
public class test {
public static void main(String[] args) {
System.out.println("a");
pp();
System.out.println("b");
}
public static void pp() throws RuntimeException {
throw new RuntimeException("sa");
}
}
main函数里面可以pp()函数不用try…catch…但是会把错误直接抛给main函数main函数所在线程将会终止,如果main函数也写throws RuntimeException 那么将错误抛给虚拟机,虚拟机终止 ,所以都只输出 a 和异常 sa
修改代码:
package my;
import javax.management.RuntimeErrorException;
public class test {
public static void main(String[] args) {
System.out.println("a");
try{
pp();
}catch(RunTimeException e){
}
System.out.println("b");
}
public static void pp() throws RuntimeException {
throw new RuntimeException("sa");
}
}
此时pp()函数的异常已被main函数自己处理,则只会报错下边也会执行
运行结果:
a b 为什么没有sa那时因为已被捕获但是在catch里面没有被输出
受检查异常:
package my;
import javax.management.RuntimeErrorException;
public class test {
public static void main(String[] args)throws Exception {
System.out.println("a");
pp();
System.out.println("b");
}
public static void pp() throws Exception {
throw new Exception("sa");
}
}
运行结果:
a sa
修改代码:
package my;
import javax.management.RuntimeErrorException;
public class test {
public static void main(String[] args) {
System.out.println("a");
try {
pp();
} catch (Exception e) {
}
System.out.println("b");
}
public static void pp() throws Exception {
throw new Exception("sa");
}
}
运行结果:a b 此时sa不输出是因为在mai函数中已经捕获但是没输出