1.try catch语句
基本语法
public void tryTest() {
int[] arr = new int[1];
try {
arr[1] = 10;
} catch (Exception ex) {
arr[0] = 0;
ex.printStackTrace()
}
}
2.异常分类
异常类图
特性
-
派生于Error或者RuntimeException的异常称为unchecked exception,语法不要求一定要使用try catch语句或者throws语句处理异常
-
所有其他的异常成为checked exception,语法要求必须要使用try catch语句或者 throws语句处理的异常
3.throws关键字
定义一个方法的时候可以使用throws关键字声明。使用throws关键字声明的方法表示此方法不处理异常,而交给方法调用处进行处理
public void myMethod1() throws Exception {
throw new Exception(); // 必须抛出异常给调用处
}
public void myMethod2() {
throw new RuntimeException(); // 不必须抛出异常给调用处
}
throw关键字
异常的抛出需要使用throw关键字,抛出的是一个异常对象,一般我们采用下面的方式进行抛出
throw new NullPointerException();
特点
- 可以使用throws关键字,抛出一个异常。可以抛出多种类型的异常,用逗号分开就可以。
- 抛出的异常类型,可以是实际异常的父类或者本身
接口中使用throws语句
- 接口中声明了抛出异常,实现类中可以抛,也可以不抛。抛的话必须是接口声明的类或其子类
- 接口中没有声明抛出异常,实现类中可以抛RuntimeException,也可以不抛。如果抛 checked exception,就会出错。可以选择catch住 checked exception,然后将它封在RuntimeException里
4.异常的传递
方法调用栈:方法一个调用一个的层层调用
Java异常的传递:沿着方法调用栈顺序一直抛,最终要么被catch住,要么当前线程出错退出
5.自定义异常
- 继承异常类即可实现自定义异常
- 异常最重要的信息:类型、错误信息和出错时的调用栈
public class MyException extends RuntimeException {
private String code;
public MyException(String message) {
super(message);
this.code = message;
}
public MyException(String message, Throwable cause) {
super(message, cause);
this.code = message;
System.out.println(cause.toString());
}
public String getCode() {
return code;
}
}
6.try catch finally语句
- 无论是代码正常执行还是出错,finally一定会执行(可以认为finally语句会在方法返回后,后面的方法开始前,会在return语句后)
- finally里给return用的变量值赋值没用
try finally 语句
只捕捉错误以及退出操作,不做错误处理
多个catch
public class CatchMultiException {
private static void catchMultiOld() {
try {
throwMultiException(0);
// 如果一个方法抛出多种异常,可以针对多个类型有多种catch语语句
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private static void catchMultiTypeMultiMatch() {
try {
throwMultiException(0);
// catch的类型不能有多种匹配可能,否则会出错
}
// catch (Exception e) {
// e.printStackTrace();
// }
catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
}
}
private static void catchMultiNew() {
try {
throwMultiException(0);
// 如果捕获了不同类型的异常,但是处理方式一样,可以用简化模式
} catch (ClassNotFoundException | IOException e) {
e.printStackTrace();
}
}
}
自动回收资源的try语句
实现了AutoCloseable接口的类表示可以自动回收
public class MyAutoClosableResource implements AutoCloseable {
private String resName;
private int counter;
public MyAutoClosableResource(String resName) {
this.resName = resName;
}
public String read() throws IOException {
counter++;
if (Math.random() > 0.1) {
return "You got lucky to read from " + resName + " for " + counter";
} else {
throw new IOException("resource不存在哦");
}
}
@Override
public void close() throws Exception {
System.out.println("资源释放了:" + resName);
}
}
使用自动回收资源的try语句,try后面添加了一个(),()创建了实现AutoCloseable接口的类的实例
public class TryWithResource {
public static void main(String[] args) {
try (
MyAutoClosableResource res1 = new MyAutoClosableResource("res1");
MyAutoClosableResource res2 = new MyAutoClosableResource("res2")
) {
while (true) {
System.out.println(res1.read());
System.out.println(res2.read());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}