概述
异常就是 Java 程序在运行过程中出现的错误
异常的继承关系:
JVM 如何处理异常
main 函数收到这个问题时,有两种处理方式:
- 自己将该问题处理,然后继续运行
- 自己没有针对的处理方式,只能交给调用 main 的JVM来处理
- JVM 有一个默认的异常处理机制,即将该异常的名称,异常的信息,异常出现的位置打印在控制台上,同时将程序停止运行。
异常处理方式
1、try…catch…finally
try:用来检测异常
catch:用来捕获异常
finally:用来释放资源
public class Demo1_Exception {
public static void main(String[] args) {
Demo d = new Demo();
try {
int x = d.div(10, 0);
System.out.println(x);
}catch(ArithmeticException e) {
System.out.println("除数出错啦");;
}
}
}
class Demo{
public int div(int a, int b) {
return a / b;
}
}
处理多个异常:
public class Demo2_Exception {
//try catch 处理多个异常
public static void main(String[] args) {
int a = 10;
int b = 0;
int[] arr = {11, 22, 33, 44};
try{
arr = null;
System.out.println(arr[10]);
}catch(ArithmeticException e){
System.out.println("除数不能为0");
} catch (ArrayIndexOutOfBoundsException e){
System.out.println("索引越界了");
} catch (Exception e){
System.out.println("出错了");
}
}
}
只要一个异常触发,程序停止,后面的不会执行。而且在这种情况下,一般小的异常放前面,大的异常放后面,因为根据多态的原理,如果大的异常放前面,那么后面的异常都不会被接收,没有意义。
实际开发中,一般这么写:
public class Demo2_Exception {
//try catch 处理多个异常
public static void main(String[] args) {
int a = 10;
int b = 0;
int[] arr = {11, 22, 33, 44};
try{
arr = null;
System.out.println(arr[10]);
}catch(Exception e){
e.printStackTrace();
}
}
编译期异常和运行期异常的区别
Java中的异常被分为两大类,编译时异常和运行时异常。
- 所有的RuntimeException类及其子类的实例被称为运行时异常
- 其它的异常就是编译时异常
编译时异常:Java程序必须显示编写异常处理方式,否则程序就会发生错误,无法通过编译。(未雨绸缪)
try{
FileInputStream fis = new FileInputStream("xxx.txt"); //这个异常是为了防止文件读不到
} catch(Exception e){
e.printStackTrace();
}
运行时异常:就是程序员所犯的错误,必须要去修改代码,或像编译时异常那样显示处理
Throwable 的几个常见方法
getMessage() //获取异常信息,返回字符串
toString() //获取异常类名和异常信息,返回字符串
printStackTrace() //获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void
public class Demo3_Throwable {
public static void main(String[] args) {
try{
System.out.println(1 / 0);
} catch (Exception e){
System.out.println(e.getMessage());
System.out.println(e);
e.printStackTrace();
}
}
}
输出: