目录
一、含义
程序运行期间发生的不期而至的各种意外状况。例如文件找不到、网络连接失败等。
二、异常分类
Throwable类下的直接子类:Error、Experience。
Error:代表程序运行时Java系统内部的错误,与程序设计者操作无关,无需捕获处理。
RuntimeException:Java编译器不会检查,无需捕获处理。
编译时异常:编译器会强制要求进行处理。
三、异常处理
1. 捕获异常
try{
//可能出现异常的代码
}catch (异常类型 变量名) {
//处理异常的方式
}
…
finally{
//一定会执行的代码
}
示例:
public class Demo2 {
public static void main(String[] args) {
System.out.println(0 / 0);
}
}
运行结果:
如上抛出了ArithmeticException,处理异常用try-catch-finally即可。
public class Demo2 {
public static void main(String[] args) {
try {
System.out.println(0 / 0);//出现异常的代码
}catch (ArithmeticException e){
System.out.println("除数不能为0!");
e.printStackTrace();//将异常的跟踪栈信息输出
}
finally {
System.out.println(0 / 2);//无论是否抛出异常,finally都会执行
}
}
}
运行结果:
2. 抛出异常
如果不知道怎么处理捕获的异常,要用throws再次抛出,交给当前方法的上一层调用者,如此不断抛出,直至处理或最终交给JVM。
(1)throw 语句
throw 异常对象;
import java.util.Scanner;
public class Demo2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("a=");
int a = scanner.nextInt();
System.out.print("b=");
int b = scanner.nextInt();
double result = division( a, b );
System.out.println(result);
}
public static double division(int a, int b){
if (b==0){
throw new ArithmeticException();
}
double result = a / b;
return result;
}
}
运行结果:
(2)throws 语句
(修饰符)(返回值类型)(方法名)(参数列表)throws Exception1,...{...}
import java.util.Scanner;
public class Demo2 {
public static void main(String[] args) throws ArithmeticException {
Scanner scanner = new Scanner(System.in);
System.out.print("a=");
int a = scanner.nextInt();
System.out.print("b=");
int b = scanner.nextInt();
double result = a / b;
System.out.println(result);
}
}
运行结果:
四、自定义异常类
很多时候有些项目会出现特有问题(未被Java所描述并封装成类),可将这些特有的问题自定义为异常类。
- 自定义异常类都是运行时异常,继承Exception类或RuntimeException类。
- 必须通过throw手动自行抛出
- 至少定义两个构造方法,即无参构造和带String的有参构造,用来描述异常信息。
示例:
import java.util.Scanner;
public class Demo2 {
public static void main(String[] args) {
NumberTest numberTest = new NumberTest();
Scanner scanner = new Scanner(System.in);
System.out.print("b=");
int b = scanner.nextInt();
try{
numberTest.number(b);
}catch (NumberException e) {
e.printStackTrace();//打印自定义异常信息
}
}
}
class NumberException extends Exception{//继承Exception
public NumberException(){//空参构造
}
public NumberException(String message) {//带参构造
super(message);
}
}
class NumberTest {
public void number(int b) throws NumberException {
if( b < 0 )
throw new NumberException("数为负数");//抛出异常对象
else
System.out.println(b);
}
}
运行结果:
number()方法用throw抛出自定义异常NumberException,number()方法本身不处理该异常,继续向上一层抛出。main()调用number()方法,编译器会强制要求main()方法处理NumberException,并打印自定义异常跟踪栈信息。