ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java中的Checked和Unchecked异常

2022-06-10 02:00:51  阅读:173  来源: 互联网

标签:Java 处理 unchecked 编译 checked Checked 异常 Unchecked


Java中的Checked和Unchecked异常

在上课过程中讲述了Checked和Unchecked类型的异常,下面对其划分和处理进行归纳整理。

首先

Java异常分为两种类型,checked异常和unchecked异常,这是从异常处理机制的角度所做的分类,check即编译器检查程序是否已经抛出或处理了可能的异常。下面给出其划分,其中红色框架及其子类型为Uncheck类型异常,蓝色框架及其子类型为checked类型异常。

image-20220610011026996

Checked异常

Checked异常是Exception类的子类中除去运行时异常的所有其他异常类,如IO异常,这类异常必须被捕获并进行处理否则编译就无法通过,异常被捕获之后需要进入异常处理,可以通过thorws、throw、try catch和finall来进行:

  • throws:声明本方法可能会发生xx异常;
  • throw:抛出xx异常;
  • try catch、 finally:捕获并处理异常;

下面给出一个checked异常的代码示例:

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
public class Main {
public static void main(String[] args) {
    File f = new File("C:\test.txt");
    FileReader r = new FileReader(f); //A
    BufferedReader br = new BufferedReader(r);
    br.readLine(); //B
    br.close(); //C
    }
}

这段代码不能通过编译,原因是A,B和C行会抛出IOException,必须将这段代码放入try-catch块中,或者给main方法加上throws IOException才能编译。

Unchecked异常

Unchecked异常包括运行时异常和Error,由于运行时异常和Error异常都是在编译阶段无法发现的,只有程序运行时才能发现的异常,所以编译器在编译时无法对其进行检查,这类异常是不需要在编译的时候用try catch、throws等机制来处理的,编译可以通过,执行时如果出现就直接导致程序失败;

其中典型的运行时异常有空指针、数组访问越界等,通常是程序的逻辑错误引起的;

Error类

Error类描述的是java运行时系统内部出现的错误和系统资源不足的异常情况,比如用户输入错误、设备错误或者物理限制(内存不足等),程序员对于这些内部错误通常是没有办法解决的,一旦发生需要想办法让程序优雅的结束;

一些典型的Error:

  • VirtualMachineError:Java虚拟机坏了或者内存不足以支持继续运行
  • OutOfMemoryError:无法再分配并且垃圾回收程序也不能再提供可用的内存
  • StackOverflowError:栈移除错误,递归调用很多次会出现

下面给出一个unchecked异常的代码示例:

public class Main {
    public static void main(String[] args) {
        int a = 0;
        int b = 100;
        int c = b/a;
    }
}

该段代码可以编译,但执行会报错。ArithmeticException是一个unchecked异常。

Exception in thread “main” java.lang.ArithmeticException: / by zero
at Main.main(Main.java:13)

二者对比

Checked exception Unchecked exception
基本区别 必须被显示地捕获或者传递,
否则编译无法通过
异常可以不被捕获或抛出,
编译器不检查
分类 继承自Exception类,除了运行时异常其他的子类 运行时异常及其子类,Error类
处理策略 从异常发生的现场获取详细的信息,
利用 异常返回的信息来明确操作失
败的原因, 并加以合理的恢复处理
简单打印异常信息,无法再继续处理
表示 代码看起来较复杂 简单清晰

所以总的来说,异常可以分类为Unchecked和Checked两种,是针对编译器是否在编译时检查这类异常来讲的,前者包括运行时异常和Error类,都是编译时无法预测的,不需要进行异常处理,编译器可以通过;剩余的Exception子类都是Checked异常,必须使用throw、throws、try catch和finally来捕获并处理,处理一般输出导致错误的原因,并提供恢复的一些操作。

一些观点

编译器强制捕获或者抛出unchecked异常使开发人员时刻记着要处理异常。

抛出checked异常的方法必须声明throws,throws成为了方法或者接口的一部分,给后续版本增加或者修改方法的异常带来不便。

unchecked异常不需要显式地处理反而使异常处理变的困难。

调用checked异常的方法,就必须处理这个方法的异常,这使得上层的调用者代码混乱。

选择checked还是unchecked都是由你自己决定的,很难说哪种就一定正确,反之就一定错误。目前比较流行的语言中,Java似乎是唯一支持checked异常的语言,其他语言都只有unchecked异常。

标签:Java,处理,unchecked,编译,checked,Checked,异常,Unchecked
来源: https://www.cnblogs.com/hit-rhino54/p/16361762.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有