异常
异常体系
Throwable
Error
Exception -->RuntimeException & 非RuntimeException
异常就是程序出现了不正常的情况
处理
Error:严重问题,一般不需要处理,如StackOverflowError(例如:递归,或不断创建线程时可能会出现)、OutOfMemoryError(例如:方法区无法满足内存分配需求时)
Exception:称为异常类,它表示程序本身可以处理的问题
- RuntimeException 运行时异常,当运行出现问题后,需要我们修改代码,如NullPointerException、IndexOutOfBoundsException,都是RuntimeException及其⼦类
- 非RuntimeException ,编译时异常,编译时就需要处理,否则程序不能通过编译,就更不能正常运行了,如IOException、SQLException,都是Exception及其⼦类,这些异常是⼀定需要try catch捕获的
JVM的默认处理方案
如果程序出现了异常,我们没做任何处理,最终JVM会做默认处理
- 把异常的名称,异常原因及异常出现的位置等信息输出在控制台
- 程序停止执行
try、catch处理
try{
//可能出现异常的代码;
}catch{
//异常的处理代码;
}
执行流程:程序从try里面的代码块开始执行,出现异常会自动生成一个异常类对象,该对象会被提交给java运行时系统,当Java运行时系统接收到异常对象时,会到catch中去找匹配的异常类,找到后进行异常的处理,执行完毕后程序继续往下执行。
throws处理
throws 异常类名;//跟在方法的括号后面
抛出异常,谁调用谁处理
Throwable的成员方法
先给给出栗子:
public class Test {
public static void main(String[] args) {
int[] a={1,2,3};
try{
System.out.println(a[6]);
}catch(ArrayIndexOutOfBoundsException e){
System.out.println(e.getMessage());
System.out.println("___________________");
System.out.println(e.toString());
System.out.println("___________________");
e.printStackTrace();
}
}
}
/*
运行结果如下:
6
___________________
java.lang.ArrayIndexOutOfBoundsException: 6
___________________
java.lang.ArrayIndexOutOfBoundsException: 6
at test.Test.main(Test.java:7)
Process finished with exit code 0
*/
- getMessage() 返回throwable的详细消息字符串
- toString() 返回此可抛出异常的简短描述
- printStackTrace() 把异常的错误信息输出在控制台
自定义异常throw
public class 异常类名 extends Exception{
无参构造;//没有错误信息
带参构造;//使用supper传递错误信息
}
throw new 自定义异常;
throw和throws的区别
throws:用在方法声明的后面,跟的是异常的类名;表示抛出异常,由该方法的调用者来处理;表示出现异常的一种可能性,并不一定会发生这种异常;
throw:用在方法体内,跟的是异常对象名;表示抛出异常,由方法体的语句处理,执行throw一定抛出了某种异常