前言
异常是程序在”编译“或者”执行“的过程中可能出现的问题
Java中的异常类均以Throwable为父类,而Throwable又派生出Error类和Exception类这两大子类。
- Error类及其子类,代表了JVM自身的异常。这一类异常发生时,无法通过程序来修正。最可靠的方式就是尽快地停止JVM的运行。
- Exception类及其子类,代表程序运行中发生了意料之外的事情。这些意外的事情可以被Java异常处理机制处理。而Exception类及其子类又可以划分为两大类:
- RuntimeException及其子类:这一类异常其实是程序设计的错误,
通过修正程序设计是可以避免的
。例如,数组越界异常、数值异常等。 - 非RuntimeException及其子类:这一类异常的发生通常由外部因素导致,
是不可预知和避免的
。例如,IO异常、类型寻找异常等
一、处理异常
- throws声明抛出异常
有些时候我们需要把异常抛出,在适当的地方去处理异常。这个时候就可以使用throws抛出异常,
把异常交给方法的调用者处理
。
如果一个方法没有捕获到一个检查性异常,那么该方法必须使用 throws 关键字来声明。throws 关键字放在方法签名的尾部。
也可以使用 throw 关键字抛出一个异常,无论它是新实例化的还是刚捕获到的。
一个方法可以声明抛出多个异常,多个异常之间用逗号隔开。
import java.io.*;
public class className
{
public void deposit(double amount) throws RemoteException
{
// Method implementation
throw new RemoteException();
}
//Remainder of class definition
}
- try…catch抓取异常
我们可以对可能出现异常的代码提前做好准备。这个时候就可以使用到try…catch了。
使用 try 和 catch 关键字可以捕获异常。try/catch 代码块放在异常可能发生的地方。
try/catch代码块中的代码称为保护代码,使用 try/catch 的语法如下:
try{
//可能出现异常的代码
}catch(异常类型 标识符){
//对异常做相应的处理
}
Catch 语句包含要捕获异常类型的声明。当保护代码块中发生一个异常时,try 后面的 catch 块就会被检查。
如果发生的异常包含在 catch 块中,异常会被传递到该 catch 块,这和传递一个参数到方法是一样。
二、自定义异常
- 所有异常都必须是 Throwable 的子类。
- 如果希望写一个检查性异常类,则需要继承 Exception 类。
- 如果你想写一个运行时异常类,那么需要继承 RuntimeException 类。
我们也可以自定义异常类。如果要定义运行时异常只要继承RuntimeException,定义构造方法即可。如果是定义编译时异常改成继承Exception。
//自定义运行时异常
public class MyRuntimeException extends RuntimeException {
public MyRuntimeException() {
}
public MyRuntimeException(String message) {
super(message);
}
}
//自定义编译时异常
public class TooSmallException extends Exception {
public TooSmallException() {
}
public TooSmallException(String message) {
super(message);
}
}
参考资料
https://zhuanlan.zhihu.com/p/257417149