1. 异常的三种类型
检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。
例如:打开一个不存在的文件时,异常就发生了,这些异常在编译时不能被简单地忽略。
运行时异常:运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常只能在运行时才会出现,其可以在编译时被忽略。
错误ERROR: 错误不是异常,而是脱离程序员控制的问题。如:栈溢出。
2. 异常体系结构
Java将异常当作对象来处理,并定义了一个基类java.lang.Throwable作为所有异常类的基类(超类)。
在Java API中已定义许多异常类,这些异常类分如下两类:错误Error和异常Exception。
3. 异常处理机制
3.1 异常捕获try-catch-finally
public class Application {
public static void main(String[] args) {
int a = 1;
int b = 0;
// 程序中可以有多个catch,但每个catch的捕获大小依次递进
// 不能将捕获范围大的异常类型放在前面
// finally字句可有可无,但try-catch是必须的
// finally一般用于处理IO、资源等的关闭工作
try { // 监控区域
System.out.println( a/b );
} catch (Exception e) {
System.out.println("Exception");
} catch (Error e) {
System.out.println("Error");
} catch (Throwable e) {
System.out.println("Throwable");
} finally { // 处理善后工作。无论触发异常与否,都会执行此处子句。
System.out.println("finally");
}
}
}
注意:选中需要放在catch代码块中的代码,然后使用 Ctrl + Alt + T 可出现语句选择框。如下:
try {
System.out.println("TEST");
} catch (Exception e) {
// 打印错误栈信息
e.printStackTrace();
} finally {
// TODO
}
3.2 主动抛出异常
3.2.1 throw关键字
throw关键字用于在方法中主动抛出异常。
public class Application {
public static void main(String[] args) {
new Application().test(1, 0);
}
public void test(int a, int b) {
// throw关键字用于在方法中,主动抛出异常
if (b == 0) {
throw new ArithmeticException();
} else {
System.out.println(a/b);
}
}
}
3.2.2 throws关键字
throws关键字,用于声明该方法可能抛出的异常。
3.2.3 throw 和 throws的区别
throw和throws都用于抛出异常,主要区别如下:
- throw在方法中,一次只能抛出一个异常;但throws一次性可抛出多个异常。
- throws用于对异常的声明,调用该方法者必须捕获或再次声明该异常,否则编译报错;但throw抛出的异常,调用该方法者可选择不捕获也不声明该异常,编译不会报错。
- throws是抛出异常的类型,throw是抛出异常对象。
4. 自定义异常
自定义异常有如下两个关键点:
- 自定义异常类必须继承Exception类,而非throwable超类。
- 自定义异常类中,使用toString方法打印异常信息。
/*
* 1.自定义异常类,继承Exception类。
* 2.使用toString方法,打印异常信息。
*/
public class MyException extends Exception{
private int detail;
public MyException(int var) {
this.detail = var;
}
@Override
public String toString() {
return "MyException{" + "detail=" + detail + '}';
}
}
public class Application {
// 此处选择将异常抛出给调用者
static void test(int a) throws MyException{
System.out.println("传递的参数为:" + a);
if (a > 10) {
throw new MyException(a);
}
System.out.println("OK");
}
public static void main(String[] args) {
try {
test(11);
} catch (MyException e) {
System.out.println(e);
}
}
}