java 异常日志断言调试
Posted 张小贱1987
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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的对应方法可以抛出更多的异常,编译器根本识别不到。
以上是关于java 异常日志断言调试的主要内容,如果未能解决你的问题,请参考以下文章