Java异常是一个对象,所有异常都直接或间接的继承Throwable类,异常层次结构如图:
Error类代表错误,指程序无法恢复的异常情况,常见的Error类例如内存溢出StackOverflowError等。
Exception类代表异常,指程序有可能恢复的异常情况,分为RuntimeException和checkedException两种。
checkedException可检查异常,需要在编码时进行处理的,如IOException等。
RuntimeException运行时异常,是在程序运行时发生的异常,无法预先捕捉处理。
异常经常通过try catch语句块来进行处理,也可以通过throws/throw将错误抛出到上层处理
finally用在catch语句块后面,无论是否发生异常,finally代码块总会被执行
在jdk7之后,提供了语法糖,更优雅的解决方式 try-with-resource
try (FileInputStream inputStream = new FileInputStream(new File("test"))) { System.out.println(inputStream.read()); } catch (IOException e) { throw new RuntimeException(e.getMessage(), e); }
对代码反编译发现仍使用了finally进行处理
可以通过继承已有的Exception类来自定义异常,通常使用try catch捕获处理,如果需要向外抛出,可继承RuntimeException类
spring中可以通过注解@ControllerAdvice,@ExceptionHandler(Exception.class)来自定义异常处理