learning_record_doc/java/异常/Java异常抛出.md

39 lines
2.7 KiB
Markdown
Raw Normal View History

2023-02-15 18:27:03 +08:00
# java 为什么有些异常 throw 出去需要在函数头用 throws 声明,一些就不用?
用的越多,不懂的就越多
![](assets/20210211214724454.png)
**why**
java 异常[体系结构](https://so.csdn.net/so/search?q=%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84&spm=1001.2101.3001.7020)如下
![](assets/20210211214829567.png)
Throwable 类:所有的异常类,都直接或者间接的继承这个类。三个重要的方法:
![](assets/20210211215542428.png)
堆栈跟踪是方法调用过程的轨迹,它包含了程序执行过程中方法调用的顺序和所在源代码行号。
堆栈跟踪信息从下往上,是方法调用的顺序。
**Throwable 类的两个直接子类**
Error: 是程序无法修复的严重问题,程序员无法修复,这能让程序终止,比如 jvm 内部错误、存溢出和资源耗尽等严重情况。
Exception是程序可以恢复的程序是程序员可以从掌控的比如除零异常空指针访问网络连接终端读取不存在等。
**在 Exception 下面又有两个异常:**
非受检异常指的是 java.lang.RuntimeException 和 java.lang.Error 类及其子类,所有其他的异常类都称为受检异常。两种类型的异常在作用上并没有差别,唯一的差别就在于使用受检异常时的合法性要在编译时刻由编译器来检查。正因为如此,受检异常在使用的时候需要比非受检异常更多的代码来避免编译错误。
1 受检查异常:指除 RuntimeException 以外的异常类。共同特点是,编译器会检查这类异常是否进行了处理,要么捕获,要么不抛出,否则会发生编译错误,种类很多。
2 非受检查异常(运行时异常):运行时异常是继承 RuntimeException 类的直接子类或者间接子类,运行时异常往往是程序员所犯的错误导致的 。特点是编译器不检查这类异常是否得到了处理,对于这类异常不捕获也不抛出,程序也可以编译过,一旦遇到就导致程序终止。
对于运行时异常通常不采用抛出或捕获处理方式,而是应该提前预判,防止这种发生异常,做到未雨绸缪。例如除零时候,在进行除法运算之前应该判断除数是非零的,修改示例代码如下,从代码可见提前预判这样处理要比通过 try-catch 捕获异常要友好的多
所以 checked exception 就是要强制你去处理这个异常(不管你 throws 多少层,你终归要在某个地方 catch 它);而 runtime exception 则没有这个限制,你可以自由选择是否 catch。
> 本文由 [简悦 SimpRead](http://ksria.com/simpread/) 转码, 原文地址 [blog.csdn.net](https://blog.csdn.net/zzwpublic/article/details/113792054)