0 概述
对于java工程师来说,是经常和异常打交道的,本文主要来谈一谈java中的异常。
1 异常类的继承关系
从下图(说明:图中只是列出部分异常类)可以看出:
- 异常的基类为Throwable,主要分为两个分支,即Error体系和Exception体系。
- Exception下面分为RuntimeException和非RuntimeException(如IOException)
2 几种异常的区别
Java里面异常分为两大类:checked exception(检查异常)和unchecked exception(非检查异常),对于非检查异常也叫RuntimeException(运行时异常),对于运行时异常,java编译器不要求捕获或者抛出,但是对检查异常要求你必须捕获或者继续抛出,不然编译会报错。
- Error表明应用程序除了比较严重的问题,不应该捕获这种异常,显然这种异常也属于非受检异常,比如StackOverflowError。当然这种异常也是可以捕获的,只是捕获后没有太大意义,因为大多数情况下都无法处理。
- RuntimeException 属于非受检异常, 比如如典型的NullPointerException。
- Exception下的非RuntimeException异常,属于检查异常,比如IOException,在使用IO操作类时候,编译器会提示捕获或者抛出这类异常。
import java.io.IOException;
/**
* Created by apple on 18/1/10.
*/
public class ExceptionTest {
public static void main(String[] args) {
// testRuntimeException();
//Error:(12, 32) java: 未报告的异常错误java.io.IOException; 必须对其进行捕获或声明以便抛出
//testNotRuntimeException();
// testError();
tryCatch();
}
//不要求捕获或者抛出
public static void testRuntimeException() {
throw new RuntimeException("testRuntimeException");
}
public static void testNotRuntimeException() throws IOException {
throw new IOException("testNotRuntimeException");
}
public static void testError() {
throw new StackOverflowError("error");
}
//可以捕获所以的异常
public static void tryCatch() {
try {
testError();
testNotRuntimeException();
testRuntimeException();
} catch (Throwable throwable) {
System.out.println("I catch throwable" + throwable);
}
}
}
3 总结
对于异常很多人喜欢直接try catch 所有的异常,这显然是不对的。我们应该捕获能处理的异常,抛出不能处理的异常。