1.throw关键字:
- 1.作用:
- 可以使用throw关键字在指定的方法中抛出指定的异常
- 2.使用格式:
- throw new xxxException(“异常产生的原因”)
- 3.注意:
- 1.throw关键字必须写在方法的内部
- 2.throw关键字后边new的对象必须是Exception或者它的子类
- 3.throw关键字抛出指定的异常对象,我们就必须处理这个对象
- 4.throw关键字后边创建的是RuntimeException或者它的子类,我们可以不处理,把他交给jvm处理
- 5.throw关键字后边创建的是编译异常,我们就必须处理这个异常,要么throws,要么try…catch
2.异常处理的第一种方法:交给别人处理
- 1.当方法内部抛出异常对象时,我们必须处理这个对象
- 2.可以使用throws关键字处理异常,会把异常对象声明抛出给方法的调用者处理(自己不处理,给别人处理)最终交给JVNM进行中断处理
- 3.使用格式:
修饰符 返回值类型 方法名(形参列表) throws XXXException,...{
throw new XXXException("产生原因");
。。。
}
- 4.注意:
- 1.throws关键字必须写在方法声明处
- 2.throws关键字后边声明多个异常必须是Exception或者它的子类
- 3.方法内部如果抛出多个异常,那么throws后边必须也声明多个异常
如果抛出的多个异常对象有子父类关系,那么直接声明父类即可 - 4.调用一个声明抛出异常的方法,我们就必须处理声明的异常
①要么继续使用throws声明抛出,将诶方法的调用者,最终由JVM处理
② 要么try…catch自己处理异常
3.Objects非空判断
- requireNonNull()是Objects类中的静态方法:(需要用类名进行访问)
- public static requireNonNull(T obj):查看指定对象是不是null
- public static requireNonNull(T obj,String str):查看指定对象是不是null,str也会随异常一同打印在控制台
源码:
public static <T> requireNonNull(T obj){
if(obj==null){
throw new NullPointerException();
}
return obj;
}
public class Demo02Exception {
public static void main(String[] args) {
method(null);
}
public static void method(Object obj) {
//对传递过来的参数进行合法性判断,判断是否为null
/*
if(obj==null){
throw new NullPointerException("传递的参数为空");
} */
//Objects.requireNonNull(obj);//不要需要自己再写判空语句
Objects.requireNonNull(obj,"传递的参数为空");
}
}
4.异常处理的第二种方式:自己处理异常
- 1.格式:
try{
可能产生异常的代码
}catch(定义一个异常的变量,用于接收try中抛出的异常){
异常的处理逻辑,产生异常对象后怎么处理
一般在工作中,会把异常的信息记录到一个日记中
}
...
catch(异常类名 变量名){
}
- 2.注意:
- 1.try中可能抛出多个异常对象,那么久可以使用多个catch来处理异常对象
- 2.①如果try中产生啦异常,异常代码后边的代码不会执行,而是去执行catch中的异常处理逻辑,执行完毕catch中的异常处理逻辑,继续执行tyr…catch 之后的代码
- ②如果没有出现异常,那么就不执行catch的异常处理逻辑,执行完try中的代码后,直接执行try…catch之后的代码
示例:
public class Demo04Exception {
public static void main(String[] args) {
try{//可能出现异常的代码
readFile("d:\\a.tx");
}catch (IOException e){//异常处理的逻辑代码
System.out.println("传递的文件后缀名不对");
}
System.out.println("后续代码");
}
/*
如果传递的路径,不是.txt
那么我们就抛出异常,告知调用者,文件名后缀不对
*/
private static void readFile (String fileName) throws IOException {
if(!fileName.endsWith(".txt")){
throw new IOException("文件名后缀不对");
}
System.out.println("路径没有问题");
}
}
运行结果分析:
①可以看出,左边的主方法由于传入的文件名不对,出现的异常,但我们可以看到它的后续代码块依旧有被执行,原因是这个异常是由主方法自己捕获并且处理,并没有交给JVM做中断处理。
②右边的主方法由于并没有出现异常,所以只执行了try里边的和后续的代码,并没有进行异常的处理.
5.Throwable异常类:
定义啦三个对异常对象的处理方法:
- String getMessage()–返回throwable 的简短描述
- String toString()–重写啦Object类的toString方法
- void printStackTrace()–最全面的异常描述
System.out.println(e.getMessage());//文件名后缀不对
System.out.println(e.toString());//java.io.IOException: 文件名后缀不对
e.printStackTrace();
/*
java.io.IOException: 文件名后缀不对
at Demo04Exception.readFile(Demo04Exception.java:42)
at Demo04Exception.main(Demo04Exception.java:26)
*/