1.什么是异常?
Java异常是一个描述在代码段中发生的异常(也就是出错)情况的对象。
当异常情况发生,一个代表该异常的对象被创建并且在导致该错误的方法中被抛出(throw)。该方法可以选择自己处理异常或传递该异常。两种情况下,该异常被捕获(caught)并处理。
2.异常是如何产生的?
异常可能是由Java运行时系统产生,或者是由你的手工代码产生。被Java运行时抛出的异常,要么是违反了语言规范,要么是超出Java执行环境限制。手工编码产生的异常基本上用于报告方法调用程序的出错状况。
3.异常是在何时发生的?
异常属于运行时错误。
4.如何处理异常?
1)常用方法
有两种方法:一是JRE捕获并抛出(这时默认处理程序显示一个描述异常的字符串,打印异常发生处的堆栈轨迹并且终止程序);另一种是在程序中通过代码捕获并处理(程序不会终止)。
Java异常处理代码是通过5个关键字控制:try、catch、throw、throws和 finally。
try块中放要被监控的代码;
catch负责捕获不同类型的异常;
throw负责手动抛出一个异常;
throws负责定义方法要抛出的异常;
finally块中放置在方法返回前绝对被执行的代码。
2)注意事项
try/catch执行顺序:一旦异常被引发,程序控制由try块转到catch块。执行永远不会从catch块“返回”到try块。一旦执行了catch语句,程序控制从整个try/catch机制的下面一行继续。
多重catch语句:当你用多catch语句时,记住异常子类必须在它们任何父类之前使用是很重要的。
finally创建一个代码块。该代码块在一个try/catch 块完成之后另一个try/catch出现之前执行。finally块无论有没有异常抛出都会执行。
5.异常的类型
1)Exception的父类
所有异常类型都是内置类Throwable的子类。因此,Throwable在异常类层次结构的顶层。Throwable下面是两个把异常分成两个不同分支的子类。
一个分支是Exception。该类用于用户程序可能捕捉的异常情况。它也是你可以用来创建你自己用户异常类型子类的类。在Exception分支中有一个重要子类RuntimeException。该类型的异常自动为你所编写的程序定义并且包括被零除和非法数组索引这样的错误。
另一类分支由Error。Error定义了在通常环境下不希望被程序捕获的异常。Error类型的异常用于Java运行时系统来显示与运行时系统本身有关的错误。堆栈溢出是这种错误的一例。本章将不讨论关于Error类型的异常处理,因为它们通常是灾难性的致命错误,不是你的程序可以控制的。
2)Java内置异常
在标准包java.lang中,Java定义了若干个异常类。前面的例子曾用到其中一些。这些异常一般是标准类RuntimeException的子类。因为java.lang实际上被所有的Java程序引入,多数从RuntimeException派生的异常都自动可用。而且,它们不需要被包含在任何方法的throws列表中。Java语言中,这被叫做未经检查的异常(unchecked exceptions )。因为编译器不检查它来看一个方法是否处理或抛出了这些异常。 java.lang中定义的未经检查的异常列于表1。表2列出了由 java.lang定义的必须在方法的throws列表中包括的异常,如果这些方法能产生其中的某个异常但是不能自己处理它。这些叫做受检查的异常(checked exceptions)。Java定义了几种与不同类库相关的其他的异常类型。
异常 | 说明 |
---|---|
ArithmeticException | 算术错误,如被0除 |
ArrayIndexOutOfBoundsException | 数组下标出界 |
ArrayStoreException | 数组元素赋值类型不兼容 |
ClassCastException | 非法强制转换类型 |
IllegalArgumentException | 调用方法的参数非法 |
IllegalMonitorStateException | 非法监控操作,如等待一个未锁定线程 |
IllegalStateException | 环境或应用状态不正确 |
IllegalThreadStateException | 请求操作与当前线程状态不兼容 |
IndexOutOfBoundsException | 某些类型索引越界 |
NullPointerException | 非法使用空引用 |
NumberFormatException | 字符串到数字格式非法转换 |
SecurityException | 试图违反安全性 |
StringIndexOutOfBounds | 试图在字符串边界之外索引 |
UnsupportedOperationException | 遇到不支持的操作 |
异常 | 意义 |
---|---|
ClassNotFoundException | 找不到类 |
CloneNotSupportedException | 试图克隆一个不能实现Cloneable接口的对象 |
IllegalAccessException | 对一个类的访问被拒绝 |
InstantiationException | 试图创建一个抽象类或者抽象接口的对象 |
InterruptedException | 一个线程被另一个线程中断 |
NoSuchFieldException | 请求的字段不存在 |
NoSuchMethodException | 请求的方法不存在 |