java异常和Exception

简介

Exception和Error都继承了Throwable类,java中只有Throwable类才可以被抛出(throw)或者捕获(catch),它是异常处理机制的基本组成类型

Exception和Error体现了java平台设计者对不同异常情况的分类

Exeption是程序正常运行中,可以预料的意外情况,可能并且应该被捕获,进行相应处理.error是在正常情况下,不大可能出现的情况,绝大部分Error都会导致程序(比如JVM自身)处于异常的,不可恢复的状态.既然是非正常的情况,所以不便也不需要捕获,常见的比如oom之类,都是error的子类

Exception又可以分为可检查(checked)异常和不检查(unchecked)异常,可检查异常在源代码里必须显示地进行捕获处理,这是编译器检查的一部分

不检查异常就是所谓的运行时异常,类似空指针,数组越界,之类,通常是可以编码避免的逻辑错误,根据具体需要来判断是否需要捕获,并不会在编译期强制要求

异常发生的原因有很多,通常包含以下几类

  • 用户输入非法数据
  • 打开的文件不存在
  • 网络通信时中断,jvm内存溢出

三类异常出现较多

  • 检查性异常:(非运行时异常)最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。原则上如果不处理,程序就不能编译通过。
  • 运行时异常: 运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。
  • 错误: 错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。
    从图中可以看出所有异常类型都是内置类Throwable的子类,因而Throwable在异常类的层次结构的顶层。

接下来Throwable分成了两个不同的分支,一个分支是Error,它表示不希望被程序捕获或者是程序无法处理的错误。另一个分支是Exception,它表示用户程序可能捕捉的异常情况或者说是程序可以处理的异常。其中异常类Exception又分为运行时异常(RuntimeException)和非运行时异常。

下面将详细讲述这些异常之间的区别与联系:

捕获Error

通常建议程序只捕获Exception,而不捕获Error,后者是可以避免的,不应该是程序去处理。但特殊场景下,还是需要捕获Error,即catch Throwable,让人知道程序中发生什么问题。

目前工作中遇到2个情况因为捕获的是Exception而不是Error,导致程序无法正常运行。

1、使用google的ortools库(jni):因为和操作系统相关,需要判断运行环境是否兼容,如果不兼容,则不使用ortools库,而使用常规java库处理。判断的代码会抛出Error,需要catch Throwable。

2、使用自定义类加载器,做插件,抛出java.Lang.LinkageError,而程序捕获的是Exception。Error导致定时线程退出,处理程序变成“幽灵”,具体现象是:插件无法更新,且没有任何错误日志。

通常建议程序只捕获Exception,而不捕获Error,后者是可以避免的,不应该是程序去处理。但特殊场景下,还是需要捕获Error,即catch Throwable,让人知道程序中发生什么问题。

顺便记录一下:

java.Lang.LinkageError 这个异常在使用多ClassLoader的应用程序时常常会遇到,但是具体它是怎么产生的,很少人能够回答上来,于是上来来一发。

描述一下碰到这个异常的场景:应用A中使用了自定义的classLoader来加载所属应用的多个插件,以便能使各插件包达到类隔离的效果,每个插件都依赖了应用A中提供的一个依赖包M,这个依赖包在应用A中是有加载的,一般情况下,只要组件的依赖中打包时去除掉这个依赖包M,就不会有问题。但是实际的操作中,有的插件开发者经常会有意无意的将排除这个事情忘记。当把包含了依赖包M的插件发布到应用A中时,就可能出现这个异常。提示:java.lang.LinkageError.

这个错误发生的原因是同一个限定名的class类被多个不同的ClassLoader加载后,相互交叉使用导致的类冲突的情况。同一个限定名的class在不同的classLoader中属于不同的 Class实例,而JVM在加载某一个类时,需要加载所有import进入的Class,这种情况下,如果自定义的classLoader中存在与parentClassLoader需要加载相同限定名的Class时,就会抛出java.Lang.LinkageError.

原文链接:https://blog.csdn.net/ITbasketplayer/article/details/120452395

Last modification:February 6, 2023
如果觉得我的文章对你有用,请随意赞赏