面试题:Java中的异常体系,为什么我catch了异常却没有捕获错误
lipiwang 2024-11-20 18:31 8 浏览 0 评论
相信我们或多或少遇到或者听过有时候在代码里面明明try catch了异常,但是程序报错却没有捕获到错误。这个原因其实就涉及的异常体系了。我们先看看一个例子:
public class ExceptionText {
public static void main(String[] args) throws Throwable{
try{
throw new Throwable();
}catch (Exception e) {
System.out.println("new Throwable() is success.");
}
}
}
下图试运行结果
我们发现我们抛出了一个Throwable异常,没有捕获到,这是为什么呢?
首先我们先弄清异常体系,Throwable是什么,Exception又是什么。
Throwable
Java中的所有异常都来?顶级?类Throwable,Throwable下有两个?类Exception和Error。因为Exception是他的子类所以光catch的Exception的格局不够,范围没有包括他,所以没有捕获。
error
表示系统级的错误,是java运行环境内部错误或者硬件问题,不能指望程序来处理这样的问题,除了退出运行外别无选择,它是lava虚拟机抛出的。是Throwable的子类
exception
表示程序需要捕捉、需要处理的异常,是由于程序设计的不完善而出现的问题,程序必须处理的问题。是Throwable的子类
当然Error和Exception还有很多子类,这里我们说个常见异常类运行时异常
RuntimeException
继承Exception的是检查性异常,抛出是要处理的,因为他在程序编译期间就会出现问题,继承RuntimeException见名知意是运行时发生的,所以编译期间不会出现,需要人工捕获。
当然我们也可以自定义异常,只需要继承对应的异常就可以了。
捕获不到原因
相信读到这里应该明白了为啥会捕获不到错误了,因为抛出的是Throwable这个异常超类,Exception子类肯定不包括,所以我们只需要扩大捕获范围即可。
public class ExceptionText {
public static void main(String[] args) throws Throwable{
try{
throw new Throwable();
}catch (Throwable e) {
System.out.println("new Throwable() is success.");
}
}
}
运行结果成功捕获
所以我们以后在写代码时,需要精确捕获异常,考虑好程序会发生的错误,捕获相应的异常,来正确处理异常错误。
我们接下说说异常的打印信息组成和常见方法:
- 打印信息组成:
所处线程名字、异常类名、异常信息、异常堆栈、异常的源码,包名,类名,方法名,行数
- 常见方法:
getMessage : 错误信息的字符串解释
getCause:返回异常产生的原因,一般是原始异常如果不知道原因返回null
printStackTrace:打印异常出现的位置或原因,不建议使用,该方法会产生的字符串记录的是堆栈信息,太长太多,内存被填满,建议使用logger输出到日志文件
toString:返回String格式的Throwable信息,此信息包括Throwable的名字和本地化信息
initCause:初始化原始异常
PrintStream和PrintWriter作为产生实现重载,这样就能实现打印栈轨迹到文件或流中
常见异常:
NullPointException:空指针异常,对象是null时会出,在调用传入对象时尽量判断是否为nullldk8里面可以用Optiona对象来避免
IndexOutOfBoundsException:数组下标越界,数组的下标超过了最大值时会抛出,在选代循环时检查下标是否越界
NumberFormatException:数字类型转化异常,将非数字类型转成数字类型,将类型转化的代码catch住
ClassCastException:类型转换异常,发生在强转时,将不同类型转成同一类型,尽量少用强转,或用 instanceof(判断继承中子类的实例是否是父类的实现)做类型判断,或多用泛型
FileNotFoundException:找不到指定文件,文件路径错误或文件不存在,可能用了绝对路径检查文件是否存在,路径是否写错,多用相对路径
ClassNotFoundException:在classpath中找不到引用的类缺乏引用当前类的jar或没有设置classpath或 jar损坏,找到jar并放入classpath中或检查jar是否损坏
OutOfMemoryError:内存溢出异常,产生对象太多,内存不够>不要在循环体重创建大量对象,或对象及时回收,增大初始化堆:-Xms 增加最大值:-Xmx
NoClassDefFoundError:找不到相应的类错误,缺乏当前引用类的jar或jar版本不对->找到jar并放入 classpath中或找到合适的版本
ConcurrentModificationException:并发修改异常,在集合迭代时修改里面的元素->在选代时不要修改集合或用并发集合做遍历(如:ConcurrentHashMap)
NoSuchMethodError:类里找不到相应的方法,一般是iar版本不对,当前引用的jar版本中没有这个方法->检查jar版本是否正确
UnsupportedClassVersionError:版本不支持错误,编译dass的idk和运行时候的idk版本不一致或比较高>将低饭本换成高版本
StackOverflowError:栈溢出错误,一般是函数的死循环,或递归调用无法退出->检查死循环的代码,或让递归有退出值,或加大栈初始化参数
相关推荐
- lushdns – 如何使用 Windows ipconfig /flushdns 命令刷新 DNS
-
您可能已经注意到,第一次访问网站后,下次访问时该网站的加载速度会更快。这是因为您的操作系统或浏览器(如果是GoogleChrome)会缓存您访问的任何网站的IP地址和DNS(域名系统)信息。...
- Windows10电脑无法直接连接已保存无线网络逐步排查和解决方案
-
可能原因分析IP地址冲突:系统未能正确获取或释放IP地址,导致与路由器通信失败。DNS缓存/网络配置错误:旧的缓存或错误配置阻碍新连接。无线网卡驱动问题:驱动不兼容或存在故障。电源管理干扰:系统为省电...
- 删除电脑dns缓存(如何删除dns缓存)
-
用Windows+R快捷键打开「运行」,输入cmd,然后按Ctrl+Shift+Enter以管理员权限启动「命令提示符」。输入:ipconfig/flushdns回车...
- 电脑插网线无法上网的系统化解决方案
-
当电脑插上网线却无法访问网络时,可从物理连接、网络配置、驱动程序、系统设置等多维度排查问题。以下按优先级排序的解决方案,助你高效定位并解决故障。一、基础排查(解决80%常见问题)检查物理连接首先确...
- 《银与绯》国服海外畅玩解决方案(银绯什么意思)
-
对于海外玩家想要体验《银与绯》国服,使用SixFast游戏加速器是最佳选择。以下是详细操作指南:一、SixFast完整配置流程1.获取SixFast客户端-官网下载:访问sixfast.com选择对...
- steam打不开/商店打不开的最新解决方法来了
-
steam打不开/商店打不开的最新解决方法来了Steam平台采用了统一的账户系统,玩家只需注册一个账户,就可以在平台上购买、下载和玩游戏。遇到Steam平台或商店打不开的烦恼?别担心,这里有几个简单实...
- 电脑恢复DNS最简单方法(如何恢复dns默认设置)
-
当电脑遇到DNS(域名系统)问题时,通常表现为无法访问某些网站或整个网络浏览变得缓慢而不稳定。DNS负责将人类可读的域名(如www.example.com)转换为机器可读的IP地址(如192.0.2....
- WiFi越用越慢?几个简单操作让网络满血复活
-
关注硬件·聪明消费|欢迎关注钛师父动图:耳机震膜工作原理WiFi用了一段时间后便慢了?这恐怕不是幻觉,也不是运营商的猫腻,显然没有人会像苹果一样刻意降低你的网速逼你换套餐甚至换运营商。大多时候这样...
- Win11快速开启DNS加密功能(国内可用)
-
今天我花了三个小时仔细研究了Windows的DNS加密(DoH)相关的内容,最终成功开启了国内可用的DNS加密功能,如果你还不知道什么是DoH并对原理感兴趣,可以参考这篇文章:https://zhua...
- 如何在 Windows 11 或 10 中使用 CMD 清除缓存
-
当你使用操作系统的时间变长,随着时间推移,缓存文件的积累可能会导致Windows11或10系统变慢,还会占用宝贵的存储空间,尤其是当您使用M.2固态硬盘的时候。因此,定期清除缓存文件或许...
- 绝地求生PUBG商店买不了东西Steam界面一直刷新加载的解决办法
-
在绝地求生(PUBG)的最新更新中,游戏引入了一系列新功能和优化,包括地图改进、武器平衡调整以及新的皮肤和物品。然而,随之而来的是一些玩家在尝试从游戏内商店购买这些新鲜内容时遇到了绝地求生PUBG商店...
- Win11正式版网络错误访问提示0x800704cf的问题
-
有深度技术的用户在win11正式版系统电脑中出现网络错误提示0x800704cf错误代码,那么如何解决这个问题?接下来,深度官网小编为大家带来详细的解决方案,大家可以一起来看看。当Win11正式版...
- 网站维护进不去怎么办(网站在维护期间进不去)
-
当遇到网站无法访问并显示维护提示时,可能是临时维护,也可能存在其他故障。以下提供系统的排查步骤与解决方法,助你快速定位问题并解决。一、判断网站是否处于真实维护状态1.官方渠道信息核查公告查询:访问网...
- 网络适配器在设备管理器中消失的恢复方案
-
网络适配器(网卡)在设备管理器中突然消失,会导致设备无法正常联网,这通常由驱动异常、系统冲突或硬件故障引起。为帮助你高效解决问题,以下提供按操作复杂度由易到难排序的逐步恢复方案,请依次尝试。一、基础排...
- 【电脑蓝屏】常见的电脑问题解决方法
-
一、系统问题1.电脑开机慢/卡顿解决方法:关闭开机启动项:Ctrl+Shift+Esc→启动→禁用不必要的程序。清理磁盘:Win+S→搜索“磁盘清理”→勾选临时文件、...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- maven镜像 (69)
- undefined reference to (60)
- zip格式 (63)
- oracle over (62)
- date_format函数用法 (67)
- 在线代理服务器 (60)
- shell 字符串比较 (74)
- x509证书 (61)
- localhost (65)
- java.awt.headless (66)
- syn_sent (64)
- settings.xml (59)
- 弹出窗口 (56)
- applicationcontextaware (72)
- my.cnf (73)
- httpsession (62)
- pkcs7 (62)
- session cookie (63)
- java 生成uuid (58)
- could not initialize class (58)
- beanpropertyrowmapper (58)
- word空格下划线不显示 (73)
- jar文件 (60)
- jsp内置对象 (58)
- makefile编写规则 (58)