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