JAVA异常处理与异常信息获取(Throwable类)
java异常处理的关键字:try、catch、finally、throw、throws
抛出异常throw
在编写程序时,一定要考虑 到程序出现问题的情况。如在定义方法时,方法要接受参数。那么,当调用方法使用接受到的参数时,要优先考虑对参数合法性的判断。如果数据不和法,应该告诉调用者。**使用抛出异常来告诉调用者**
throw关键字,用来抛出一个指定的异常对象。操作如下
- 创建一个对象,封装提示信息。
- 需要将异常对象告知调用者。throw关键字就是用来将这个异常传递给调用者的。
- 用在方法内抛出 一个异常,并结束当前方法的执行。
使用格式:
throw new xxException("异常原因");
注意:
- throw关键字必须在方法内部。
- throw关键字后new的对象必须是Exception或Exception的子类。
- throw关键字抛出指定的异常对象,必须进行处理。
- throw关键字后创建的是RuntimeException或其子类可以不进行处理,交给JVM处理。
- throw关键字后创建的是编译异常(写代码的时候报错),则必须处理这个异常throws或者try...catch。
public stactic int getElement(int[] arr,int index){
if(arr == null){
throw new NullPointerException("传递的参数null");//NullPotionterException空指针异常
/*
当调用这个方法时先对其传进来参数进行校验
NullPointerException(运行时异常,可以交给JVM处理)
*/
}
if(index < 0 || index > arr.length-1){
throw new ArrayIndexOfBoundsException("数组索引越界");//ArrayIndexOfBoundsException数组索引越界异常
/*
当调用这个方法时先对其传进来参数进行校验
ArrayIndexOfBoundsException(运行时异常,可以交给JVM处理)
*/
}
return arr[index];
}
Objects非空判断
Objecta中的静态方法requireNonNull用来判断传进来的是不是null,如果则抛出NullPointerException空指针异常。
方法源代码
public static <T> T requireNonNUll(T obj){
if(obj == null)
throw new NullPointerException();
return obj;
}
/*
requnireNonNull();重载方法可以接受两个参数:第一个是obj,第二个是异常抛出时debug窗口输出的String。
*/
声明异常throws
throws关键字:交给别人处理遗产。
作用:当方法内部抛出异常对象的时候,我们必须进行处理。可以使用throws处理异常对象,会把异常对象抛出给调用者。(自己不处理)最终交给JVM处理-->中断处理。
使用格式: 方法声明时使用
修饰符 返回值类型 方法名 (参数列表) throws XXXException..{
throw new XXXException("异常产生的原因");
}
注意:
1.throws关键字必须写在方法的声明处。
2.throws关键字后边声明的异常必须是Exception或其子类。
3.方法内部如果抛出了多个异常对象,throws后必须也声明多个异常。
4.若抛出的对象有子父关系,直接声明父类。
5.调用了一个声明抛出异常的方法,必须处理。要么继续使用throws抛出方法给掉用者处理,要么
抛给JVM,要么try...catch自己处理。
public static void readFile(String fileName) throws FileNotFoundExcetion{
if(!fileName.equals("D:\\\\test.txt")){
throw new FileNotFoundExcetion("文件路径不对");//FileNotFoundException是编译异常,必须处理这个异常。可以使用throws继续抛出。
}
}
try...catch捕获异常
如果异常出现,立刻终止程序。所以我们要自己处理。
- 该方法不处理,而是声明抛出,由该方法的调用者来处理(throws)
- 在方法中使用try-catch来处理异常
try-catch就是捕获异常。
- 捕获异常:java中对异常有针对性的语句进行捕获,可以对出现的异常指定处理方式。
语法如下:
try{
//可能会出现异常的语句
}catch(/*异常类型*/ e/*用来接收try中抛出的异常,抛出什么样的类型。变量什么类型*/){
//记录/打印/继续抛出/处理逻辑
}
//catach可以有多个
Throwable类获取异常信息
Throwable ——> Exception的父类
Throwable类中定义了三个异常处理的方法
String getMessage() 返回 throwable 的简短消息字符串。
String toString() 返回 throwable 的详细消息字符串。
void printStackTrace() JVM打印异常对象,默认方法,打印的最为全面。
finally代码块
finally:无论是否出现异常都会执行。 finally:无法单独使用,必须和try一起。一般用于资源释放(回收),无论是否异常都要执行,IO流。
使用格式:
try{
//可能会产生异常的代码
}catch(){
//异常处理逻辑
}finally{
//无论是否异常都会执行
}