Java 异常
一、异常简述1.三种异常类型2.异常层次结构
Throwable 类是 Java 语言中所有错误或异常的超类。
3.了解异常处理
错误:只能通过修改源代码来解决
//OutOfMemoryError: Java heap space 内存溢出错误
int arr[] = new int[1024*1024*1024];
例外:可以执行特定处理以保持程序运行
1.使用 throw 关键字来处理
2.在声明方法时使用 throws 关键字抛出异常
3.使用 try catch finally 关键字捕获抛出的异常
二、异常处理1.Java异常处理过程
1.JVM在遇到异常时会创建一个异常对象(对象内容包括:内容、原因、位置)
2.寻找try catch或者方法的throws异常,如果没有抛出异常,直接交给JVM处理
3.JVM在控制台打印收到的异常信息,如果没有抛出异常则终止程序
一个简单的异常程序示例
2.异常处理 throw 关键字
功能
抛出异常
格式
throw new xxxException("异常产生的原因")
代码示例
//定义一个空数组
int[] arr = null;
//判断数组是否为空
if(arr == null){
//如果 if 判断成立,则使用 throw 关键字抛出异常
throw new NullPointerException("数组传递过来为空");
}
//定义一个长度为 5 的数组
int[] arr = new int[5];
//设置 arr 数组的一个索引值
int index = 5;
//判断数组索引是否越界
if(index < 0 || index > arr.length - 1 ){
//如果 if 判断成立,则使用 throw 关键字抛出异常
throw new ArrayIndexOutOfBoundsException("数组索引越界了");
}
注意事项
1.throw 关键字必须写在方法内部
2.throw 关键字后的新对象必须是 Exception 或 Exception 子类对象
3.throw关键字抛出指定的异常对象,我们必须处理这个异常对象
抛出关键字
功能
当方法内部抛出异常对象时,必须处理异常对象。
可以使用throws关键字处理异常对象,将异常对象声明抛给方法的调用者处理(自己不要处理,交给别人处理),最后交给JVM用于处理→中断处理。
格式
修饰符 返回值类型 方法名(参数列表) throws xxxExcepiton, yyyExcepiton, ...{
throw new xxxExcepiton("xxx异常产生原因");
throw new yyyExcepiton("yyy异常产生原因");
...
}
代码示例
public void test() throws /*FileNotFoundException*/ IOException{
/*
FileNotFoundException extends IOException
如果抛出的多个异常对象有子父类关系,那么直接声明父类异常即可
*/
//定义一个目标文件路径
String file = "c:\\exception.txt";
//传递 c:\error.txt 与目标文件路径比较
if(!file.equals("c:\\error.txt")) {
throw new FileNotFoundException("文件路径不是c:\\exception.txt");
}
//传递 c:\exception.doc 与目标文件路径比较
if(!file.endsWith("c:\\exception.doc")){
throw new IOException("文件的后缀名不是.txt");
}
}
注意事项
1.throws关键字必须写在方法声明中
2.throws关键字后声明的异常必须是Exception或者Exception的子类
3.如果方法内部抛出了多个异常对象,那么在 throws 之后也必须声明多个异常
4.调用了声明抛出异常的方法,声明的异常必须处理
try catch finally 关键字
尝试:捕获异常。
catch:处理异常。
finally:finally块的内容不管有没有异常都会被执行。
功能
当方法内部抛出异常对象时,必须处理异常对象。
可以使用try catch关键字来捕捉和处理异常对象,程序员可以根据情况进行处理。
格式
人数
catch 块由try 语句捕获的异常数量决定,大多数情况下只有一个catch 块。
finally 块是可选的。
try{
可能产生异常的代码
}catch(异常类名 变量名){
异常的处理逻辑,异常异常对象之后,怎么处理异常对象
一般在工作中,会把异常的信息记录到一个日志中
}
...
catch(异常类名 变量名){
...
}finally{
无论是否出现异常都会执行
}
代码示例
public class DemoTryCatchFinally {
public static void main(String[] args) {
//定义一个目标文件路径
String file = "c:\\exception.txt";
try {
//传递 c:\error.txt 与目标文件路径比较
if(!file.equals("c:\\error.txt")) {
throw new FileNotFoundException("文件路径不是c:\\exception.txt");
}
} catch (IOException e) {
//异常的处理逻辑
//方法一
System.out.println(e.getMessage());
//方法二
System.out.println(e.toString());
//方法三(最常用)
e.printStackTrace();
} finally {
//无论是否出现异常,都会执行
System.out.println("资源被释放了");
}
}
}
异常类的超类Throwable类中定义了三种异常处理方法,大家可以根据需要选择合适的一种。
String getMessage() 返回此 throwable 的简短描述。
String toString() 返回此 throwable 的详细消息字符串。
void printStackTrace() JVM打印异常对象,默认此方法,打印的异常信息是最全面的。
多重异常处理
多个异常分别处理
每一个异常使用一对 try catch
多个异常被一次捕获并多次处理
使用一个 try 多个 catch
一次捕获多个异常,一次处理
使用一个 try 一个 catch
注意事项
1.try有没有异常
2.终于不能单独使用了,必须配合try一起使用
3.finally一般用于资源释放(资源回收),无论程序是否异常,最后都需要资源释放(IO)
4.如果try和finally都有return语句,try的返回值会被finally的返回值代替
三、自定义异常
Java提供的异常类并不能满足所有的实际需要,需要自己定义一些异常类。
格式
public class xxxException extends Exception | RuntimeException{
添加一个空参数的构造方法
添加一个带异常信息的构造方法
}
代码示例
定义自定义异常类
public class DemoException extends Exception{
//添加一个空参数的构造方法
public DemoException(){
super();
}
/*
添加一个带异常信息的构造方法
查看源码发现,所有的异常类都会有一个带异常信息的构造方法,方法内部会调用父类带异常信息的构造方法,让父类来处理这个异常信息
*/
public DemoException(String massage){
super(massage);
}
}
使用自定义异常类
public class DemoExceptionTest {
public static void main(String[] args) throws DemoException {
test01();
test02();
}
//使用 throws 关键字抛出异常
private static void test01() throws DemoException {
throw new DemoException("自定义异常");
}
//使用 try catch 捕获并抛出异常
private static void test02() {
try {
throw new DemoException("自定义异常");
} catch (DemoException e) {
e.printStackTrace();
}
}
}
注意事项
1.自定义异常类一般以Exception结尾声明异常的关键字是,表示该类是异常类
2.自定义异常类声明异常的关键字是,必须继承Exception或者RuntimeException