受检异常、非受检异常、异常处理、主动抛出异常

1.异常定义

异常是发生在程序执行过程中阻碍程序正常执行的错误操作,只要在 Java 语句执行中产生异常则一个异常对象就会被创建。Throwable 是所有异常的父类,它有两个直接子类 Error 和 Exception,其中 Exception 又被继续划分为被检查的异常(checked exception)和运行时的异常(runtime exception,即不受检查的异常);Error 表示系统错误,通常不能预期和恢复(譬如 JVM 崩溃、内存不足等);被检查的异常(Checked exception)在程序中能预期且要尝试修复(如我们必须捕获 FileNotFoundException 异常并为用户提供有用信息和合适日志来进行调试,Exception 是所有被检查的异常的父类);运行时异常(Runtime Exception)又称为不受检查异常,譬如我们检索数组元素之前必须确认数组的长度,否则就可能会抛出 ArrayIndexOutOfBoundException 运行时异常,RuntimeException 是所有运行时异常的父类

非受检异常(RuntimeException):这类异常是编程人员的逻辑问题,不需要对异常进行捕获或者抛出。程序自动输入异常信息,常见的异常有:NullPointerException,ClassCastException,ArrayIndexsOutOfBoundsException、
受检异常(非RuntimeException):这类异常是由一些外部的偶然因素所引起的,必须对该类型的异常进行捕获或者抛出;受检异常可以控制义务逻辑,可在catch中处理异常带了的问题,常见的异常有:Exception, FileNotFoundException, IOException, SQLException。
受检异常和非受检异常的区别就是:是否强制要求调用者必须处理此异常,如果强制要求调用者必须进行处理,那么就使用受检异常,否则就选择非受检异常(RuntimeException)

 

2.Error与Exception

Error 表示系统级的错误,是 java 运行环境内部错误或者硬件问题,不能指望程序来处理这样的问题,除了退出运行外别无选择,它是 java 虚拟机抛出的。Exception 表示程序需要捕捉、需要处理的异常,是由与程序设计的不完善而出现的问题,程序可以处理的问题。

 

3.异常处理

try 块:用于捕获异常。其后可接零个或多个 catch 块,如果没有 catch 块,则必须跟一个 finally 块。
catch 块: 用于处理 try 捕获到的异常。
finally 块: 无论是否捕获或处理异常,finally 块里的语句都会被执行。当在 try块或 catch 块中遇到 return 语句时,finally 语句块将在方法返回之前被执行。

注意: 当 try 语句和 finally 语句中都有 return 语句时,在方法返回之前,finally 语句的内容将被执行,并且 finally 语句的返回值将会覆盖原始的返回值。如下:

public class Test {
public static int f(int value) {
try {
return value * value;
} finally {
if(value==2){
return 0;
}
}
如果调用 f(2),返回值将是 0,因为 finally 语句的返回值覆盖了 try 语句块的返回值。

4.抛出异常

throws关键字通常被应用在声明方法时,用来指定可能抛出的异常。多个异常可以使用逗号隔开。当在主函数中调用该方法时,如果发生异常,就会

将异常抛给指定异常对象

​publiC class Shoot {

static void Pop() throws NegativeArraySizeException {

//定义方法并抛出NegativeArraySizeException异常

int [] arr = new int[-3];//创建数组,使其长度为-3,使其能够出现异常

}

pub1ic static vo1d main (String [] args) {

try{ .

Pop() ;

} catch (NegativeArraySizeException exp) {

System. out .println("Pop()方法抛出异常,异常信息为:"+exp);

}

}

}

异常处理的方法

Throwabl e类中定义了3个异常处理的方法
String getMessage()_ 返回此throwable 的简短描述。
String tostring() 返回此throwable 的详细消息字符串。
void printstackTrace() JVM打印异常对象, 默认此方法,打印的异常信息是最全面的

多个异常的处理方法

1.多个异常分别处理。
2.多个异常一次捕获,多次处理。

     一个try多 个catch注意事项:
     catch里边定义的异常变量,如果有子父类关系。那么子类的异常变量必须写在上边,否则就会报错

3.多个异常一次捕获一次处理。

try {
int[] arr = {1,2,3};
//System. out . println(arr[3]);//ArrayIndexOutOfBoundsException: 3
List<Integer> list = List.of(1, 2, 3);
System. out . println(list. get(3);//IndexoutOfBoundsException: Index 3 out-of-bounds for length 3
}catch (Exception e){
System. out. println(e);
}


运行时异常被抛出可以不处理。即不捕获也不声明抛出。
如果finally有return语句,永远返回finally中的结果,避免该情况.
如果父类抛出了多个异常,子类重写父类方法时,抛出和父类相同的异常或者是父类异常的子类或者不抛出异常。
父类方法没有抛出异常,子类重写父类该方法时也不可抛出异常。此时子类产生该异常.只能捕获处理,不能声明抛出
在try/catch后可以追加finally代码块,其中的代码一定会被执行,通常用于资源回收。


 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java 中的异常分为两种类型:受检异常(checked exceptions)和未受检异常(unchecked exceptions)。 受检异常是指在代码编译期间就需要处理的异常,必须在方法签名中声明并处理,否则代码将无法通过编译。常见的受检异常包括 `IOException`、`SQLException`、`ClassNotFoundException` 等。当代码可能抛出受检异常时,可以使用 `try...catch` 块或 `throws` 关键字来处理异常。示例代码如下: ``` public void readFile(String fileName) throws IOException { BufferedReader br = null; try { br = new BufferedReader(new FileReader(fileName)); String line; while ((line = br.readLine()) != null) { System.out.println(line); } } catch (IOException e) { System.err.println("读取文件出错:" + e.getMessage()); throw e; } finally { if (br != null) { try { br.close(); } catch (IOException e) { System.err.println("关闭文件出错:" + e.getMessage()); } } } } ``` 在上面的代码中,`readFile` 方法声明了 `IOException` 异常,表示该方法可能抛出 `IOException` 异常。在方法内部,我们使用 `try...catch` 块来捕获可能抛出的 `IOException` 异常,并在 `catch` 块中打印错误信息,并将异常重新抛出。最后,我们在 `finally` 块中关闭文件流,并在可能出现的异常情况下打印错误信息。 未受检异常是指在运行时才能发现的异常,不需要在方法签名中声明,也不需要进行处理。常见的未受检异常包括 `NullPointerException`、`ArrayIndexOutOfBoundsException`、`ClassCastException` 等。当代码可能抛出未受检异常时,可以使用 `try...catch` 块来捕获异常并进行处理,但是这样做并不是必须的。示例代码如下: ``` public int divide(int a, int b) { if (b == 0) { throw new IllegalArgumentException("除数不能为零"); } return a / b; } ``` 在上面的代码中,`divide` 方法可能抛出一个 `IllegalArgumentException` 异常,表示除数不能为零。由于 `IllegalArgumentException` 是一个未受检异常,我们不需要在方法签名中声明该异常,也不需要使用 `try...catch` 块来处理异常。当方法抛出该异常时,调用该方法的代码可以选择捕获异常并进行处理,或者将异常继续抛出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值