java为什么有些异常throw出去需要在函数头用throws声明,一些就不用?
用的越多,不懂的就越多
why?
java异常体系结构如下
Throwable类:所有的异常类,都直接或者间接的继承这个类。三个重要的方法:
堆栈跟踪是方法调用过程的轨迹,它包含了程序执行过程中方法调用的顺序和所在源代码行号。
堆栈跟踪信息从下往上,是方法调用的顺序。
Throwable类的两个直接子类:
Error:是程序无法修复的严重问题,程序员无法修复,这能让程序终止,比如jvm内部错误、存溢出和资源耗尽等严重情况。
Exception:是程序可以恢复的程序,是程序员可以从掌控的,比如,除零异常,空指针访问,网络连接终端,读取不存在等。
在Exception下面又有两个异常:
非受检异常指的是java.lang.RuntimeException和java.lang.Error类及其子类,所有其他的异常类都称为受检异常。两种类型的异常在作用上并没有差别,唯一的差别就在于使用受检异常时的合法性要在编译时刻由编译器来检查。正因为如此,受检异常在使用的时候需要比非受检异常更多的代码来避免编译错误。
1 受检查异常:指除RuntimeException以外的异常类。共同特点是,编译器会检查这类异常是否进行了处理,要么捕获,要么不抛出,否则会发生编译错误,种类很多。
2 非受检查异常(运行时异常):运行时异常是继承RuntimeException类的直接子类或者间接子类,运行时异常往往是程序员所犯的错误导致的 。特点是编译器不检查这类异常是否得到了处理,对于这类异常不捕获也不抛出,程序也可以编译过,一旦遇到就导致程序终止。
对于运行时异常通常不采用抛出或捕获处理方式,而是应该提前预判,防止这种发生异常,做到未雨绸缪。例如除零时候,在进行除法运算之前应该判断除数是非零的,修改示例代码如下,从代码可见提前预判这样处理要比通过try-catch捕获异常要友好的多
所以checked exception就是要强制你去处理这个异常(不管你throws多少层,你终归要在某个地方catch它);而runtime exception则没有这个限制,你可以自由选择是否catch。
相关文章
- Caused by: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'company' in 'class java.lang.String'
- 大型网站技术架构(四)--核心架构要素 开启mac上印象笔记的代码块 大型网站技术架构(三)--架构模式 JDK8 stream toMap() java.lang.IllegalStateException: Duplicate key异常解决(key重复)
- Java线程详解
- java.security.InvalidKeyException: Illegal key size
- Java 异常机制详解
- 第34节:Java当中的异常
- 【java】异常
- Java Singleton的3种实现方式
- java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result异常的解决方法
- Python与Java异常类层级区别
- java基础的第二轮快速学习!day04
- flijnk异常Caused by: java.lang.ClassCastException: org.codehaus.janino.CompilerFactory cannot be cast to org.codehaus.commons.compiler.ICompilerFactory
- 毕业设计 Java web物流配送管理系统
- 浅析Java中如何生成随机数:random.nextInt()与Math.random()的基础用法、什么是伪随机数
- Java | 异常类【万字详解,看过来】
- JAVA异常总结!!(使用方法)
- java 排序算法
- Atititjs javascript异常处理机制java异常转换.js exception process
- Java小白入门200例102之自定义异常
- Java小白入门200例103之异常处理的规则
- 使用Java代码实现进制转换——十进制转十六进制、八进制、二进制