java 简单分析异常机制

没有特别复杂的概念,偏向于理解。重点为“运行时异常”和“非运行时异常”。

参考:http://blog.csdn.net/huhui_cs/article/details/38817791

 

一、Java异常体系结构

(1)Throwable

在Java中,异常被当做对象处理,定义了一个抽象类java.lang.Throwable作为所有异常的父类。

我们可以从字面意义理解:Throwable意为“能够被抛出的”(有异常的东西才会被粗暴地对待),继承Throwable的异常类都是可以被抛出的。

Throwable有两个子类:Error和Exception,分别表示错误和异常。其中异常Exception分为运行时异常(RuntimeException)和非运行时异常,也可以称为不检查异常(Unchecked Exception)和检查异常(Checked Exception)。

 

(2)Error

一般是指java虚拟机内部发生的问题,如系统崩溃、虚拟机出错误、动态链接失败等。

这种错误无法恢复或不可能捕获(是虚拟机本身的问题),将导致应用程序中断。应用程序无法捕获Error,所以我们无法(也用不着)在应用程序中处理Error,只能由虚拟机自己解决。

(3)可查异常和不可查异常

通常,Java的异常(包括Exception和Error)分为可查的异常(checked exceptions)和不可查的异常(unchecked exceptions)。

1.可查异常

可查异常(编译器要求必须处置的异常,编译期间就能找到的异常,等同于非运行时异常):程序在运行中非常可能出现的异常状况。可查异常虽然是异常,但在一定程度上是可以预计到的,所以必须提前防范,采取某种方式进行处理。

这种异常的特点是Java编译器会检查它(在编译期间能检查出来)。当程序中可能出现这类异常,要么用try-catch语句捕获它,要么用throws子句声明抛出它,否则程序无法通过编译。

2.不可查异常

不可查异常(编译器不要求强制处置的异常/编译期间检查不出来的异常,等同于运行时异常,运行时才出现的异常):包括运行时异常(RuntimeException与其子类)和错误(Error)。

比方说1除以0,在编译器看来,只是两个整型在做除法运算而已,编译当然能通过。但是在实际运行时,1除以0当然是无法被运算的,应该在运行时被抛出(上面提到的Error(虚拟机的问题)也是无法被编译器发现的,所以也被算在不可查异常中)。

如果使用throw在方法体中抛出可查异常,则需要在方法头部声明方法可能抛出的异常类型。throw出一个异常之后程序会立即终止,无法执行后面的语句,然后在包含它的所有try块中(可能在上层调用函数中)从里向外寻找含有与其匹配的catch子句的try块,如果找到则由catch处理,找不到则被main()/run()抛出(取决于当前抛出异常的线程是单线程还是多线程)。

(4)运行时异常和非运行时异常

1.运行时异常

运行时异常都是RuntimeException类及其子类异常,如NullPointerException、IndexOutOfBoundsException等。

运行时异常都是不可查异常(不跑起来根本不知道会有问题),所以程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。

出现运行时异常后,如果没有捕获这个异常,系统会把异常一直往上层抛,一直到最上层,如果是多线程就由Thread.run()抛出,如果是单线程就被main()抛出。抛出之后,如果是线程,这个线程就退出了。如果是主程序抛出的异常,这个程序就退出了。总之,如果不对运行时异常进行处理,要么导致线程中止,要么导致主程序终止(换句话说,如果不想导致终止,必须捕获所有运行时异常)。

2.非运行时异常

非运行时异常是RuntimeException以外的异常,类型上都属于Exception类及其子类,如IOException、SQLException、用户自定义的Exception异常。

对于非运行时异常,Java编译器强制要求catch并处理,否则程序无法通过编译。

(5)一些常见的运行时异常

面试时经常被考察的知识点。

1.ArrayStoreException

试图将错误类型的对象存储到一个对象数组时,抛出该异常。

2.ClassCastException

试图将对象强制转换为不是子类的实例时,抛出该异常。

3.IllegalArgumentException

向方法传递了一个不合法或不正确的参数时,抛出该异常。

4.IndexOutOfBoundsException

指示某排序索引(例如对数组、字符串或向量的排序)越界时,抛出该异常。

5.NullPointerException

需要使用对象的地方为null时,抛出该异常。

二、总结

主要是概念问题,清楚即可。

发表评论

电子邮件地址不会被公开。 必填项已用*标注