Java核心技术:异常、断言和日志——处理错误

Java核心技术:异常、断言和日志——处理错误

异常分类

在Java语言中,异常对象都是派生于Throwable类的一个实例。
异常层次结构
所有的异常都是由Throwable继承而来,在下一层立即分解为两个分支:Error和Exception。

  • Error类层次结构描述了Java运行时系统的内部错误和资源耗尽错误。应用程序不应该抛出这种类型的对象。如果出现了这样的内部错误,除了通告给用户,并尽力使程序安全地终止之外,再也无能为力了。
  • Exception层次结构又分解为两个分支:一个分支派生于RuntimeException;另一个分支包含其他异常。
    Exception划分两个分支的规则是:由程序错误导致的异常属于RuntimeException;而程序本身没有问题,但由于像I/O错误这类问题导致到异常属于其他异常。
    派生于RuntimeException的异常包含下面几种情况:
  • 错误的类型转换。
  • 数组访问越界。
  • 访问null指针。
    不是派生于RuntimeException的异常包括:
  • 试图在文件尾部后面读取数据。
  • 试图打开一个不存在的文件。
  • 试图根据给定的字符串查找Class对象,而这个字符串标识的类并不存在。
    “如果出现RuntimeException异常,那么就一定是你的问题”是一条相当有道理的规则。

Java语言规范将派生于Error类或RuntimeException类的所有异常称为非受查(unchecked)异常,所有其他的异常称为受查(checked)异常。编译器将检查是否为所有的受查异常提供了异常处理器。

声明受查异常

方法应该在其首部声明所有可能爬出的异常。这样可从首部反映出这个方法可能抛出哪类受查异常。
在自己编写方法时,不必将所有可能抛出的异常都进行声明。需要记住在遇到下面4中情况时应该抛出异常:

  1. 调用一个抛出受查异常的方法。
  2. 程序运行过程中发生错误,并且利用throw语句抛出一个受查异常。
  3. 程序出现错误,例如,a[-1]=0会抛出一个ArrayIndexOutOfBoundsException这样的非受查异常。
  4. Java虚拟机和运行时库出现的内部错误。
    如果出现前两种情况之一,则必须告诉调用这个方法的程序员有可能抛出异常。因为任何一个抛出异常的方法都有可能是一个死亡陷阱。如果没有处理器捕获这个异常,当前执行的线程就会结束。

对于那些可能被他人使用的Java方法,应在方法的首部声明这个方法可能抛出的异常。如果可能抛出多个受查异常类型,就必须在方法的首部列出所有的异常类。每个异常类之间用逗号隔开。但是,不需要声明Java的内部错误,即从Error继承的错误。任何代码都具有抛出那些异常的潜能,而我们对其没有任何控制能力。通用,也不应该声明从RuntimeException继承的那些非受查异常。
ArrayIndexOfOutOfBoundsException
这些运行时错误完全在我们的控制之下。如果特别关注数组下标引发的错误,就应该将更多的时间花费在修正程序中的错误上,而不是说明这些错误发生的可能性上。

总之,一个方法必须声明所有可能抛出的受查异常,而非受查异常要么不可控制(Error),要么就应该避免发生(RuntimeException)。

如何抛出异常

抛出异常

  • 找到一个合适的异常类。
  • 创建这个类的一个对象。
  • 将对象抛出。
    一旦方法抛出异常,这个方法就不可能返回到调用者。就不必为返回的默认值或错误代码担忧。

创建异常类

在程序中,如果遇到任何标准异常类都没能充分地描述清楚,就需要创建自己的异常类。我们需要做的只是定义一个派生于Exception或Exception自雷的类。习惯上,定义的类应该包含两个构造器,一个是默认的构造器,另一个是带有详细描述信息的构造器(超类Throwable的toString方法会打印出这些详细信息,在调试中非常有用)。自定义异常类
Thrawable

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值