java.lang.Throwable是所有错误、异常的父类
其子类包含:
-
Error:工程师无法处理,只能尽量避免。
-
Exception:异常产生后程序员可以通过代码的方式纠正,使程序继续运行,是必须要处理的。
1、Check Exception
编译期异常,即红线,需要在编译前处理好
2、RunTimeException
运行期异常,Exception的子类,不处理系统会自动抛出:索引越界、空指针异常
3、异常处理方式
基本原理:如果抛出异常,那么就必须管它(自己try catch处理或者使用throws继续抛给上层调用或JVM)
- a抛出: 声明此方法可能会发生的异常(不在函数内处理):在方法声明处添加 “Throws 异常类型”,将异常抛给调用者或虚拟机处理(用这种方法出现异常程序会终止运行,且 如果是运行期异常,可以不用管它), 同时还可以在内部可能出现问题的地方使用 “thread new 异常类名称” 主动抛出特定种类异常(包括自定义异常)
- b捕获: 使用trycatch,在捕获异常后会继续执行程序。
try{
可能异常的语句
}catch(Exception e){
异常的处理逻辑
}
注意:
-
针对运行期异常:可以不处理,运行时会自动抛出。
-
抛出时如果想要抛出特定异常:
throw new 异常a:即new一个异常对象,然后抛给上层调用。
如果new的是运行期异常,那么可以不用在声明处 “throws 异常a”
如果new的是编译期异常,那么必须在声明处 “throws 异常a”
(这个处理方式更像自己为某些参数进行范围限制,自己决定什么时候是异常)
4、Error错误
int[ ] a = new int[102410241024];
OutOfMemoryError:内存溢出错误
即创建的数组大小超过了分配给JVM的内存
//此时只能对源代码进行修改,改小数组的大小。
5、Object的非空判断
在一个方法中,一般需要对其形参进行合法性判断,如对象非空等,可以自己写,也可以使用Objects的 requireNonNull(T obj, String str) 对传入的obj进行判空,如果为空,则抛出空指针异常并输出str字符串。
public class DemoException {
public static void main(String[] args) {
soutStr(null);
}
public static void soutStr(String str){
/*if(str == null){ //自己抛异常
throw new NullPointerException("出现异常,传入的对象不能为空");
}*/
Objects.requireNonNull(str,"出现异常,传入的对象不能为空"); //使用requireNonNull
System.out.println(str);
}
}
Throwable三个常用的方法
- public String getMassage(): 返回的是异常的简短信息,内容如 IOException(“传递的文件名后缀不正确”);里的中文
- public String toString(): 返回异常的种类+内容
- public String printStackTrace():返回的是详细信息,JVM控制台打印的就是这个
finally代码块
和try一起使用
无论出不出异常,都会执行;一般用于资源释放(IO)
执行顺序:
- 无异常:try 接下来 finally
- 有异常:try到异常语句 接下来 finally 最后再 catch
想要无论有没有出现异常都有打印"关闭OI流":
- 不使用finally的情况
try {
readFile(“clll”); //
} catch (IOException e) {
System.out.println(“关闭OI流”);
e.printStackTrace();
}
System.out.println(“关闭OI流”);
- 使用finally的情况
try {
readFile(“clll”); //想要无论有没有出现异常都有打印"关闭OI流"
} catch (IOException e) {
e.printStackTrace();
} finally{
System.out.println(“关闭OI流”);
}
子父类异常
(声明时原则:子类的抛出异常种类必须<= 父类异常,万一父类没有抛出异常,则子类不能添加throws ,throw后只能使用try catch)
public class Fu{
public void method1() throws NullPointerException,IOException{}/
public void method2() throws IndexOutOfBoundsException{}
public void method3() throws Exception{}
public void method4(){}
}
public class Zi{
public void method1() throws NullPointerException,IOException{} //抛出和父类一样的异常
public void method2() throws ArrayIndexOutOfBoundsException{} //抛出父类异常的子类
public void method3() {} //不抛出异常
}