异常发生的原因:
- 用户输入了非法数据。
- 要打开的文件不存在。
- 网络通信时连接中断,或者JVM内存溢出。
要理解Java异常处理是如何工作的,你需要掌握以下三种类型的异常:
- 检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。
- 运行时异常: 运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。
- 错误:错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。
java中常见的异常:
异常类型 | 说明 |
---|---|
Exception | 异常层次结构的父类 |
ArithmeticException | 算术错误情形,如以零作除数 |
ArrayIndexOutOfBoundsException | 数组下标越界 |
NullPointerException | 当应用程序试图在需要对象的地方使用 null 时,抛出该异常 |
ClassNotFoundException | 应用程序试图加载类时,找不到相应的类,抛出该异常。 |
IllegalArgumentException | 拒绝访问一个类的时候,抛出该异常。 |
ClassCastException | 当试图将对象强制转换为不是实例的子类时,抛出该异常。 |
NumberFormatException | 数字格式转换异常,如把"abc"转换成数字 |
语法:
try:执行可能产生异常的代码。
catch:捕获异常。
finally:无论是否发生异常,代码总能执行。
public void method(){
try{
} catch (异常类型 异常的变量名){
} catch (异常类型 异常的变量名){
} finally{
}
}
实例:
import java.util.InputMismatchException;
import java.util.Scanner;
public class Test{
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("请输入被除数:");
try {
int num1 = in.nextInt();
System.out.println("请输入除数:");
int num2 = in.nextInt();
System.out.println(String.format("%d / %d = %d",
num1, num2, num1/ num2));
} catch (InputMismatchException e) {
System.err.println("被除数和除数必须是整数。");
} catch (ArithmeticException e) {
System.err.println("除数不能为零。");
} catch (Exception e) {
System.err.println("其他未知异常。");
} finally {
System.out.println("感谢使用本程序!");
}
}
}
输出结果: