java 异常

异常

java的异常层次结构

Error类层次结构描述了Java运行时系统的内部错误和资源耗尽错误.引用程序不应该抛出这种类型的对象.如果出现了这样的内部错误,除了通告给用户,并尽力使程序安全地终止之外,再也无能为力了.

在设计Java程序时,需要关注Exception层次结构.这个层次结构又分解为两个分支:一个分支派生于RuntimeException;另一个分支包含其他异常.划分两个分支的规则是:由程序错误导致的异常属于RuntimeException;而程序本身没有问题,但由于像I/O错误这类问题导致的异常属于其他异常.
    
派生于RuntimeException的异常包含下面几种情况:
    1.
错误的类型转换

    2.
数据访问越界
    3.
访问空指针

   
不是派生于RuntimeException的异常包括:
    1.
试图在文件尾部后面读取数据
    2.
试图打开一个不存在的文件
    3.
试图根据给定的字符串查找Class对象,而这个字符串表示的类并不存在
.
    "
如果出现RuntimeException异常,那么就一定是你的问题"是一条相当有道理的规则.应该通过检测数组下标是否越界来避免ArrayIndexOutOfBoundsException异常;应该通过在使用变量之前检测是否为空来杜绝NullPointerException异常的发生.
    Java
语言将派生于Error类或RuntimeException类的所有异常称为未检查异常,所有其他的异常称为已检查异常.

RuntimeException这个名字很容易让人误解,他并不是运行时异常的意思。

 

调用一个抛出了已检查异常的方法,编译器必须要处理这个异常,要么捕获,要么抛出。

调用一个未检查异常方法,编译器不要求必须处理这个异常。如下:

红线是编译报错,需要捕获异常才可以。

想象一下为什么我们经常在代码中抛出runtimeexception?

为什么我们不需要捕获未检查异常?

因为大部分情况下未检查异常一般是程序错误,超出了我们的处理范围。应该在程序编写期间,就避免这种异常,而不是把它抛出给上层。比如我们需要处理ArrayIndexOutOfBoundsException异常吗,不需要,这是在编码阶段就需要避免出现的问题。

如果要覆盖一个超类的方法,那么子类方法抛出的已检查异常不能超过超类中已检查异常的范围。也就是说,只能抛出更少的已检查异常。或者超类中已检查异常的子类。

为什么?因为我们在调用parent.f()的时候,编译器会要求我们捕获它抛出的已检查异常,但是运行时这个parent可能指向了一个child,如果child的对应方法可以抛出更多的异常,编译器根本识别不到。

 

 

原文地址:https://www.cnblogs.com/xiaolang8762400/p/7045950.html