Java的异常
异常的定义:异常事件,程序无法按照预期的流程执行,将错误信息传递给上层的调用者并报告案发现场的信息,如果找不到一个异常处理程序,整个系统完全退出
Java内置了一套异常处理机制来表示错误,属于java中的一个类,其继承树如下所示:
Error:表示严重的错误,程序一般无能为力
Exception:运行时产生的错误,可以被捕获和处理
RuntimeException
IOException&ReflectiveOperationException
java规定:
必须捕获的异常:Exception及其子类,不包括RuntimeException及其子类
不需要捕获的异常:Error及其子类 ,RuntimeException及其子类
异常的捕获
在java中异常的捕获利用try…catch捕获,可能抛出异常的语句放置在tyr{…}中,然后用catch捕获对应的异常。可以利用多个catch语句进行捕获,jvm在捕获到异常后会从上至下进行匹配,直到匹配到对应的异常,因此异常的子类必须写在父类前面,否则永远不会被捕获到。
如果无论是否有异常都想进行某种固定的操作,比如释放空间或者清理工作,可以利用finally语句,其放置在最后,无论是否有异常被捕获都会执行。
如果某几种异常的处理程序相同,可以利用|合并到一起,减少代码的长度。
try{
//可能抛出异常的语句
}catch(Exception1|Exception2|Exception3 e){
System.out.println(e.message); //执行相同操作:输出异常信息
}finally{
//to do something or nothing
}
自定义异常
java标准库中定义的常用异常有如下几种:
Exception
│
├─ RuntimeException
│ │
│ ├─ NullPointerException
│ │
│ ├─ IndexOutOfBoundsException
│ │
│ ├─ SecurityException
│ │
│ └─ IllegalArgumentException
│ │
│ └─ NumberFormatException
│
├─ IOException
│ │
│ ├─ UnsupportedCharsetException
│ │
│ ├─ FileNotFoundException
│ │
│ └─ SocketException
│
├─ ParseException
│
├─ GeneralSecurityException
│
├─ SQLException
│
└─ TimeoutException
在大型项目中,我们往往需要定义自己的异常,一般的方式是以一个基础异常作为父类,派生出各种子类异常,通常选择RuntimeException作为父类,为自己定义的异常提供多种构造方法,方便我们构造异常实例。
public class BaseException extends RuntimeException {
public BaseException() {
super();
}
public BaseException(String message, Throwable cause) {
super(message, cause);
}
public BaseException(String message) {
super(message);
}
public BaseException(Throwable cause) {
super(cause);
}
}