异常体系

举报
孙中明 发表于 2022/04/08 09:08:03 2022/04/08
【摘要】 异常体系Java异常异常处理机制主要回答了三个问题What:异常类型回答了什么被抛出Where :异常堆栈跟踪回答了在哪抛出Why:异常信息回答了为什么被抛出Error和Exception的区别从概念角度解析Java的异常处理机制Error:程序无法处理的系统错误,编译器不做检查Exception:程序可以处理的异常,捕获后可能恢复总结︰前者是程序无法处理的错误,后者是可以处理的异常Run...

异常体系

Java异常
异常处理机制主要回答了三个问题

What:异常类型回答了什么被抛出
Where :异常堆栈跟踪回答了在哪抛出
Why:异常信息回答了为什么被抛出

image.png

  • Error和Exception的区别
    从概念角度解析Java的异常处理机制
    Error:程序无法处理的系统错误,编译器不做检查
    Exception:程序可以处理的异常,捕获后可能恢复
    总结︰前者是程序无法处理的错误,后者是可以处理的异常

RuntimeException :不可预知的,程序应当自行避免
非RuntimeException :可预知的,从编译器校验的异常CheckedException

从责任角度看︰
1.Error属于JVM需要负担的责任;
2.RuntimeException是程序应该负担的责任;
3.CheckedException可检查异常是Java编译器应该负担的责任。

image.png

常见Error以及Exception

RuntimeException
1.NullPointerException -空指针引用异常
2.ClassCastException -类型强制转换异常
3.IllegalArgumentException -传递非法参数异常4.IndexOutOfBoundsException -下标越界异常
5.NumberFormatException -数字格式异常

非RuntimeException
1.ClassNotFoundException -找不到指定class的异常
2.IOException - IO操作异常

Error
1.NoClassDefFoundError -找不到class定义的异常

NoClassDefFoundError的成因
1.类依赖的class或者jar不存在
⒉.类文件存在,但是存在不同的域中
3.大小写问题,javac编译的时候是无视大小写的,很有可能编译出来的class文件就与想要的不一样

2.StackOverflowError-深递归导致栈被耗尽而抛出的异常3.OutOfMemoryError -内存溢出异常

原则

具体明确∶抛出的异常应能通过异常类名和message准确说明异常的类型和产生异常的原因﹔
提早抛出∶应尽可能早的发现并抛出异常,便于精确定位问题﹔延迟捕获︰异常的捕获和处理应尽可能延迟,让掌握更多信息的作用域来处理异常。

自己设计异常

在用户看来,应用系统发生的所有异常都是应用系统内部的异常

设计一个通用的继承自RuntimeException的异常来统一处理
其余异常都统一转译为上述异常AppException
在catch之后,抛出上述异常的子类,并提供足以定位的信息

image.png

Java异常处理消耗性能的地方

  • try-catch块影响JVM的优化
  • 异常对象实例需要保存栈快照等信息,开销较大
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。