文章目录
一、简述Java Error类与Exception类的区别。
异常对象都是派生于 Throwable 类的一个实例,所有的异常都是由 Throwable 继承而来,但是在下一层分解为两个分支: Error 和 Exception。
- Error 类层次结构描述了 Java 运行时系统的内部错误和资源耗尽错误。Error 的出现,意味着程序出现了严重的问题,而这些问题不应该再交给 Java 的异常处理机制来处理,程序应该直接崩溃掉,比如说 OutOfMemoryError,内存溢出了,这就意味着程序在运行时申请的内存大于系统能够提供的内存,导致出现的错误,这种错误的出现,对于程序来说是致命的。
- Exception 分解为两个分支: RuntimeException 和其他异常;由于编程导致的异常属于 RuntimeException,如果程序本身没有问题,但由于像 I/O 错误这类问题导致的异常属于其他异常。
放图:
二、异常的抛出
throw 和 throws 的区别
throw
throw
关键字,用于主动地抛出异常;使用方法为 throw
关键字后面跟上 new
关键字,以及异常的类型,还有参数即可。
throw new exception_class("error message")
样例如下:
public class DemoThrow {
public static void checkGrade(int grade){
if(grade<60){
throw new ArithmeticException("挂科警告!!!");
}
}
public static void main(String[] args) {
checkGrade(59);
}
}
这段代码在运行时会报如下的错误:
Exception in thread "main" java.lang.ArithmeticException: 挂科警告!!!
at yuanMaFenxi.DemoThrow.checkGrade(DemoThrow.java:7)
at yuanMaFenxi.DemoThrow.main(DemoThrow.java:11)
throws
throws
关键字用于 声明异常,对于检查型异常,如果你没有做处理,那么编译器就会提示你 要么在方法上声明,要么将其放在 try-catch
中。
throws 和 try-catch 使用的选择
假设现在有这么一个方法,method01
可能会出现多种异常。这种情况可以用 try-catch
来处理。
public void method01(){
try{
// code that might throw exceptions
}catch (FileNotFoundException e){
// emergency action for missing files
}catch (UnknownHostException e){
//emergency action for unknown files
}
}
但是如果出现好几个类似于 method01
的方法,如果为每一个方法都加上 try-catch
就会显得非常繁琐,降低了代码的可读性。
那么就可以 使用 throws
关键字,在方法签名上声明可能会抛出的异常,然后在调用该方法的地方使用 try-catch
处理。
public static void method01() throws FileNotFoundException ,UnknownHostException{
}
public static void main(String[] args) {
try{
method01();
// code that might throw exceptions
}catch (FileNotFoundException e){
// emergency action for missing files
}catch (UnknownHostException e){
//emergency action for unknown files
}
}
二者的区别:
throws
关键字用于声明异常,它的作用和try-catch
相似;throw
关键字用于显式的抛出异常。throws
关键字用于方法签名上,但是throw
关键字用于方法体里面throws
关键字在声明异常的时候可以跟多个,但是throw
一次只能抛出一个异常。
三、异常的捕获
如果发生了某个异常,但是没有在任何地方捕获这个异常,程序就会终止。
1. 捕获异常
要想捕获异常,需要设置 try/catch
语句块,简单的 try/catch
语句块如下所示:
try{
code;
}catch(ExceptionType e){
// 对异常的具体处理
}
如果 try
语句块中的任何代码抛出了 catch
字句中指定的一个异常类,那么
- 程序将会跳过
try
语句块的剩余代码 - 然后将执行
catch
字句中的处理器代码
如果 try
语句块中的代码块没有抛出任何异常,那么程序将跳过 catch
字句。
如果发放中的任何代码抛出了 catch
子句中没有声明的一个异常类型,那么这个方法就会立即退出。
2. 捕获多个异常
在每一个 try
语句块中可以捕获多个异常类型,并对不同类型的异常做出不同的处理,要对每个异常类型使用一个单独的 catch
字句。
try{
code that might throw exceptions
}catch(FileNotFoundException e){
// emergency action for missing files
}catch(UnknownHostWException e){
//emergency action for unknown hosts
}catch(IOException e){
// emergency action for all other I/O problems
}
3. 再次抛出异常与异常链
可以在 catch
子句中抛出一个异常,通常,希望改变异常的类型时会这样做
可以把原始异常设置为新异常的”原因“。
try{
access the database
}catch(SQLException original){
var e=new XXXXException("database error");
e.initCause(original)