相关文章推荐
单身的斑马  ·  创建和使用工作区 - Azure ...·  1 年前    · 
阳刚的玉米  ·  java中如何用sm4加密一个文件 - ...·  1 年前    · 
淡定的猕猴桃  ·  拆分Python字符串中的最后一个分隔符?- ...·  1 年前    · 
火爆的铅笔  ·  json解错误解决com.google.gs ...·  2 年前    · 
知识渊博的跑步鞋  ·  使用 LibreOffice ...·  2 年前    · 
Code  ›  JAVA非受检异常和受检异常的区别等开发者社区
https://cloud.tencent.com/developer/article/1951007
坚韧的小刀
2 年前
作者头像
名字是乱打的
0 篇文章

JAVA非受检异常和受检异常的区别等

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > 软件工程 > JAVA非受检异常和受检异常的区别等

JAVA非受检异常和受检异常的区别等

作者头像
名字是乱打的
发布 于 2022-03-04 13:38:28
1.3K 0
发布 于 2022-03-04 13:38:28
举报

一 .两种异常结构

java中的异常和错误都继承自java.lang.Throwable

img

在异常处理的时候,都会接触到受检异常(checked exception)和非受检异常(unchecked exception)这两种异常类型。 非受检异常 指的是java.lang.RuntimeException和java.lang.Error类及其子类,所有其他的异常类都称为 受检异常 。两种类型的异常在作用上并没有差别。

两者的区别主要在: 受检的异常是由 编译器强制执行 的,必须捕获,用于指示不受程序控制的异常情况(例如,I/O 错误),而 非受检的异常在运行时发生,用于指示编程错误 (例如,空指针 。正因为如此,受检异常在使用的时候需要比非受检异常更多的代码来避免编译错误。

二 .两者的常见异常

uncheckedExcepiton(RuntimeException)

CheckedException

Java.lang.ArithmeticException    Java.lang.ArrayStoreExcetpion   Java.lang.ClassCastException   Java.lang.EnumConstantNotPresentException   Java.lang.IllegalArgumentException   Java.lang.IllegalThreadStateException   Java.lang.NumberFormatException   Java.lang.IllegalMonitorStateException   Java.lang.IllegalStateException   Java.lang.IndexOutOfBoundsException   Java.lang.ArrayIndexOutOfBoundsException   Java.lang.StringIndexOutOfBoundsException   Java.lang.NegativeArraySizeException’   Java.lang.NullPointerException   Java.lang.SecurityException   Java.lang.TypeNotPresentException   Java.lang.UnsupprotedOperationException

Java.lang.ClassNotFoundException   Java.lang.CloneNotSupportedException   Java.lang.IllegalAccessException   Java.lang.InterruptedException   Java.lang.NoSuchFieldException   Java.lang.NoSuchMetodException

  • 非首检异常 RuntimeException在默认情况下会得到自动处理。所以通常用不着捕获RuntimeException,但在自己的封装里,也许仍然要选择抛出一部分RuntimeException。 RuntimeException 是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类。可能在执行方法期间抛出但未被捕获的 RuntimeException 的任何子类都无需在 throws 子句中进行声明。(java api)
  • 受检异常 ,是值需要 显示 通过 Catch 捕获的异常,在Java中,除了RuntimeException以外的异常,都属于受检异常(checkedException). 我们以 NoSuchMethodException 为例,如图所示,可以明显看到,该异常在没有捕获的情况下,会显示提示语法错误,有两个解决办法
    1. Add exception to method signature ,表示把这个异常再往上抛。
    2. Surround with try/catch ,表示使用 try/catch 捕获。

三 异常的选择

一直以来,关于在程序中到底是该使用受检异常还是非受检

  • 我们通常需要保证程序不会捕捉到不在我们预期范围内的异常,比如RuntimeException,我们希望这类异常是要往外抛,而不是在内部被捕获。不要让它把异常吞掉,因为一旦程序出现问题,没有异常信息很难定位。
  • 如果希望调用者能够从异常中进行合理恢复,需要设置为受检异常类型,如果调用者无法采用任何措施使得程序无法重异常中恢复,需要把该异常设置为非受检异常。

四. 扩展:一道经典的面试题

一道非常经典的面试题,NoClassDefFoundError 和 ClassNotFoundException 有什么区别?

  • NoClassDefFoundError,表示这个类在编译时期存在,但是在运行时不能找到合适的类导致的错误。例如在运行时我们想调用某个类的方法或者访问这个类的静态成员的时候,发现这个类不可用,此时Java虚拟机就会抛出NoClassDefFoundError错误。 可能出现的错误情况如下: 对应的Class在java的classpath中不可用 你可能用jar命令运行你的程序,但类并没有在jar文件的manifest文件中的classpath属性中定义 可能程序的启动脚本覆盖了原来的classpath环境变量 因为NoClassDefFoundError是java.lang.LinkageError的一个子类,所以可能由于程序依赖的原生的类库不可用而导致 检查日志文件中是否有java.lang.ExceptionInInitializerError这样的错误,NoClassDefFoundError有可能是由于静态初始化失败导致的 如果你工作在J2EE的环境,有多个不同的类加载器,也可能导致NoClassDefFoundError
  • ClassNotFoundException,它是程序运行期间的异常,比如当我们尝试在运行时使用反射加载类时,ClassNotFoundException 就会出现。
@CallerSensitivepublic static Class<?> forName(String className)  throws ClassNotFoundException 
  Class<?> caller = Reflection.getCallerClass();  
 
推荐文章
单身的斑马  ·  创建和使用工作区 - Azure Repos | Microsoft Learn
1 年前
阳刚的玉米  ·  java中如何用sm4加密一个文件 - CSDN文库
1 年前
淡定的猕猴桃  ·  拆分Python字符串中的最后一个分隔符?-腾讯云开发者社区-腾讯云
1 年前
火爆的铅笔  ·  json解错误解决com.google.gson.stream.MalformedJsonException: Unterminated string at line 1 column 13_Leolu007的博客-CSDN博客
2 年前
知识渊博的跑步鞋  ·  使用 LibreOffice 从命令行可以做的 5 件令人惊奇的事情_linux小助理-DevPress官方社区
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号