一、语法结构
常规语法
- try块是必须的
- catch块和finally块是可选的,但至少有其中一个,也可同时出现
- 可有多个catch块,子类异常必须先于父类异常
- catch块位于try块之后,finally块位于catch块之后
try {
} catch (NullPointerException e) {
} catch (Exception e) {
} finally {
}
Java7增强语法
- 自动关闭资源的try语句
// BufferedInputStream 的父类实现了Closeable接口
try (InputStream is = new BufferedInputStream(new FileInputStream("file"))) {
is.read();
}
为了保证可以正常关闭资源,这些资源必须实现AutoCloseable或者Closeable接口
- 捕获多种异常的catch语句
// 捕获的异常为RuntimeException,否则代码中没抛这些Checked异常编译的时候会报错
try {
} catch (IndexOutOfBoundsException | NullPointerException | ArithmeticException e) {
}
二、知识点总结
Checked异常和RunTime异常
Java异常分为Checked异常和Runtime异常两大类,所有的RuntimeException类及其子类的实例被称为Runtime异常,其他的异常则被称为Checked异常;Runtime异常可处理也可忽略交给程序抛出,Checked异常如果没有处理编译将不通过,处理有两种方式:
- 使用try-catch捕获异常
- 在方法签名上使用throws声明抛出异常
try-catch异常捕获流程
Throwable、Error、Exception
finally块总会被执行,除非虚拟机退出
try {
// finally 可以执行
return;
// finally不能执行
System.exit(1);
} catch (Exception e) {
} finally {
System.out.println("invoked");
}
finally块尽量不使用return或throw
使用throws声明抛出异常和使用throw抛出异常
访问异常信息常用方法
- getMessage()
- printStackTrace()
- printStackTrace(PrintStream s)
- getStackTrace()
自定义异常
- 继承Exception类或RuntimeException类
- 通常提供一个无参构造方法和一个带一个字符串(用来描述异常信息)的构造方法
异常链
业务层捕获数据层原始异常,重新抛出一个新的业务异常,这种处理方式称为异常转译。
public class CustomException extends RuntimeException {
public CustomException(Throwable t) {
super(t);
}
public static void main(String[] args) {
try {
String s = null;
System.out.println(s.length());
} catch (Exception e) {
throw new CustomException(e);
}
}
}