概念
程序运行过程中出现的不正常现象,出现异常不处理将终止程序运行。
异常处理的必要性∶任何程序都可能存在大量的未知问题、错误;如果不对这些问题进行正确处理,则可能导致程序的中断,造成不必要的损失。
异常处理:Java编程语言使用异常处理机制为程序提供了异常处理的能力。
异常分类
Throwable:可抛出的,一切错误或异常的父类,位于java.lang包中
- Error: JVM、硬件、执行逻辑错误,不能手动处理
- StackOverflowError 栈空间一处
- OutOfMemoryError
- Exception :程序运行和配置中产生的问题,可处理
- RuntimeException:运行异常,可处理,可不处理
- CheckedException:检查时异常,必须处理
public class Demo1 {
public static void main(String[] args) {
//常见的运行时异常
String name=null;
//Exception in thread "main" java.lang.NullPointerException
// System.out.println(name.equals("asd"));
int[] arr={10,20,30};
//Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
// System.out.println(arr[3]);
Object o="hello";
//Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
// Integer i=(Integer)o;
//Exception in thread "main" java.lang.NumberFormatException: For input string: "100a"
// int i= Integer.parseInt("100a");
//Exception in thread "main" java.lang.ArithmeticException: / by zero
// int n=10/0;
// System.out.println(n);
}
}
异常的产生
当程序在运行时遇到不符合规范的代码或结果时,会产生异常或程序员使用throw关键字手动抛出异常
异常的传递
按照方法的调用链反向传递,如始终没有处理异常,最终会有JVM进行默认异常处理(打印堆栈跟踪信息)
public class Demo1 {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
System.out.println("请输入第一个数字");
int num=scanner.nextInt();
System.out.println("请输入第二个数字");
int num1=scanner.nextInt();
try {
System.out.println(num/num1);
}catch (Exception e){
System.out.println(e.getMessage());
}
System.out.println("测试");
}
}
请输入第一个数字
1
请输入第二个数字
0
/ by zero
测试
finally块在jvm虚拟机退出的时候不执行。
声明异常
trows 关键字 声明异常
使用原则:底层代码向上声明或者抛出异常,最上层一定要处理异常,否则程序中断,在方法后面添加
抛出异常
除了系统自动抛出异常外,有些问题需要程序员自行抛出异常
throw关键字: 抛出异常
throw异常对象;
throw new RuntimeException
自定义异常
需要继承Exception或Exception子类,常用RuntimeException。
- 必要提供的构造方法
- 无参构造方法
- String message参数的构造方法