2023年11月29日发(作者:)
Java异常和错误
Java异常和错误
ble类是java中所有异常(Exception)和错误(Error)的超类
异常和错误的区别在于:异常能够被程序本⾝捕获并处理,错误是程序⽆法处理的
异常
Exception异常分为两⼤类
1. 运⾏时异常:都是RuntimeException类及其⼦类异常,如空指针异常,数组越界异常。这些异常是不受检异常,程序中可以选择捕
获处理,也可以不处理。这种异常⼀般是由程序逻辑错误出错引起的,程序应从逻辑⾓度避免此类异常的产⽣。该类异常的特点是
java编译器不会去检查他,也就是当程序中可能出现此异常,即使没有try-catch捕获,也没有throw抛出异常,也能够编译通过。
package com.seele.exception;
// Java RuntimeException IndexOutOfBoundsException
实际项⽬中,不要捕获类库中定义的继承⾃的运⾏时异常类,如:
//NullPointerException
或,这类异常由程序员预检查
public class ThrowTest {
public static void main(String[] args) {
int[] arr = {0,1,2};
int el = getElement(arr,3);
}
public static int getElement(int[] arr,int index){
if (arr == null) {
throw new NullPointerException("数组为空数组");
}
if ( index < 0 || index > arr.length - 1) {
throw new ArrayIndexOutOfBoundsException("数组越界");
}
int el = arr[index];
return el;
}
}
控制台输出:
Exception in thread “main” ndexOutOfBoundsException: 数组越界
at ment(:16)
at (:6)
简化判断对象是否为null
if (arr == null) {
throw new NullPointerException("数组为空数组");
}
//
简化写法
Objects.requireNonNull(arr,"数组为空数组");
throws 关键字
throws关键字:异常处理的第⼀种⽅式,交给调⽤者去处理
作⽤:
当⽅法内部抛出异常的时候,我们就必须处理这个异常对象
可以使⽤throws关键字处理对象,会把异常对象声明逐级抛出给⽅法的调⽤者处理(⾃⼰不处理,交给别⼈处理),如果逐级抛出没
有调⽤者处理,那么最终将交由JVM处理,中断程序
使⽤格式:在⽅法声明时使⽤
访问修饰符 返回值类型 ⽅法名(参数列表) throws AAAException,BBBException{
throw new AAAException("产⽣原因");
throw new BBBException("产⽣原因");
}
注意:
1. throws 关键字必须写在⽅法声明处
2. throws 关键字后边声明的异常必须是Exception或者是Exception的⼦类
3. ⽅法内部如果抛出了多个异常对象,那么throws 后⾯就必须也声明多个异常
1. 如果抛出的多个对象存在继承关系,那么直接声明⽗类异常即可
4. 调⽤了⼀个声明抛出异常的⽅法,我们就必须处理声明的异常
1. 要么继续使⽤throws声明抛出,交给⽅法的调⽤者处理,或继续抛出最终交给JVM处理
2. 要么try-catch⾃⼰处理异常
try-catch-finally 关键字
try-catch-finally :异常处理的第⼆种⽅式,⾃⼰处理异常
格式:
try {
可能产⽣异常的代码
} catch (定义异常变量,⽤来接收try中抛出的异常对象){
异常的处理逻辑,捕获异常对象后,怎么处理对象
⼀般在⼯作中,会把异常的信息记录到⼀个⽇志中
} finally {
⽆论是否成功都将执⾏的代码块,多⽤于资源释放,如IO流的关闭
可以根据情况决定是否添加此代码块
}
注意:
1. try 中可能抛出多个异常对象,那么就可以⽤多个catch语句来分别处理这些异常对象
2. 如果try 中出现了异常,那么就将执⾏catch中的异常处理逻辑,执⾏完毕catch中的处理逻辑,继续执⾏try-catch之后的代码;如果
try中没有出现异常,那么就不会执⾏catch中的异常处理逻辑,继续执⾏try 语句块中的代码
3. finally中⽆论是否成功都将执⾏,多⽤于资源释放,如IO流的关闭
⾃定义异常
java提供的异常类不够我们使⽤,需要⾃⼰⾃定义⼀些异常类
格式:
public class xxxException extends Exception | RuntimeException {
添加⼀个空参构造
添加⼀个带异常信息的构造⽅法
}
package com.seele.exception;
//
⾃定义异常类
public class RegisterException extends Exception {
//
添加⼀个空参构造
public RegisterException() {
}
//
添加⼀个带异常的有参构造
//
查看源码发现,所有的异常类都有⼀个带异常信息的构造⽅法,⽅法内部会调⽤⽗类带异常信息的构造⽅法,让⽗类来处理这个异常信息
public RegisterException(String message) {
super(message);
}
}
注意:
1. ⾃定义异常类⼀般都是以Exception做结尾,说明该类是⼀个异常类
2. ⾃定义异常类必须继承Exception或者RuntimeException
1. 继承Exception:⾃定义异常就是⼀个编译器异常,如果⽅法内部抛出了该异常,那么就必须处理这个异常,要么throws,要么
try-catch


发布评论