Java 异常
Java教程 - Java异常
异常是在运行时在代码序列中出现的异常状况。例如,读取一个不存在的文件。
Java异常是描述异常条件的对象发生在一段代码中。
关键词
Java异常处理通过五个关键字管理: try,catch,throw,throws
和finally。
try
block包含要监视的程序语句异常。
如果在块中发生异常,则抛出异常。
catch
语句可以捕获异常并以合理的方式处理它。
要手动抛出异常,请使用关键字throw。
任何抛出的异常一个方法必须由一个 throws
子句指定。
任何代码绝对必须是在try块完成之后执行的命令被放在 finally
块中。
一旦抛出异常,程序控制就会从try块转移到catch块中。执行从未从catch返回到try块。
多个catch子句
您可以指定两个或多个catch子句,每个捕获不同类型的异常。
当抛出异常时,将按顺序检查每个catch语句,并执行类型与异常类型匹配的第一个。
在执行一个catch语句之后,绕过其他catch语句,并在try/catch块之后继续执行。
当您使用多个catch语句时,异常子类必须在它们的任何超类之前。
Java throws语句
如果一个方法想抛出一个异常,它必须指定这个行为。
这是包含throws子句的方法声明的一般形式:
type method-name(parameter-list) throws exception-list
{
// body of method
}
Java finally语句
任何代码,将被执行,不管try块放在一个 finally
阻止。
finally
创建一个代码块在 try
/catch
块完成后执行。
即使没有catch语句与异常匹配, finally
块也将执行。
finally
块可用于关闭文件句柄和释放任何其他资源。finally子句是可选的。
Java异常类型层次结构:
Throwable
|
|
+---Exception.
| |
| |
| +--- RuntimeException
|
+---Error
异常及其子类用于用户程序应捕获的异常条件。您可以子类化Exception以创建自己的自定义异常类型。
错误定义在正常情况下不期望捕获的异常。 Java运行时系统使用错误以指示运行时环境中的错误。 堆栈溢出是这种错误的一个例子。
什么是Java的内置异常
子类化RuntimeException的异常不需要包含在任何方法的throws列表中。这些被称为未检查异常。
java.lang中定义的未检查异常在下表中列出。
异常 | 含义 |
---|---|
ArithmeticException | 算术错误,如除以零。 |
ArrayIndexOutOfBoundsException | 数组索引超出边界。 |
ArrayStoreException | 分配给不兼容类型的数组元素。 |
ClassCastException | 投射无效。 |
EnumConstantNotPresentException | 尝试使用未定义的枚举值。 |
IllegalArgumentException | 用于调用方法的非法参数。 |
IllegalMonitorStateException | 非法监视器操作,例如等待解锁的线程。 |
IllegalStateException | 环境或应用程序状态不正确。 |
IllegalThreadStateException | 请求的操作与当前线程状态不兼容。 |
IndexOutOfBoundsException | 一些类型的索引是超出界限的。 |
NegativeArraySizeException | 使用负尺寸创建的数组。 |
NullPointerException | 无效引用的使用无效。 |
NumberFormatException | 字符串到数字格式的转换无效。 |
SecurityException | 试图违反安全。 |
StringIndexOutOfBounds | 尝试在字符串的边界之外建立索引。 |
TypeNotPresentException | 未找到类型。 |
UnsupportedOperationException | 遇到不支持的操作。 |
检查的异常在下表中列出。
异常 | 含义 |
---|---|
ClassNotFoundException | 找不到类。 |
CloneNotSupportedException | 尝试克隆不实现Cloneable接口的对象。 |
IllegalAccessException | 对类的访问被拒绝。 |
InstantiationException | 尝试创建抽象类或接口的对象。 |
InterruptedException | 一个线程已被另一个线程中断。 |
NoSuchFieldException | 请求的字段不存在。 |
NoSuchMethodException | 请求的方法不存在。 |
Java自定义异常类
您可以通过定义 Exception
的子类来创建自己的异常类。
异常
类没有定义自己的任何方法。它继承由 Throwable
提供的方法。
class MyException extends Exception {
private int detail;
MyException(int a) {
detail = a;
}
public String toString() {
return "MyException[" + detail + "]";
}
}
public class Main {
static void compute(int a) throws MyException {
System.out.println("Called compute(" + a + ")");
if (a > 10)
throw new MyException(a);
System.out.println("Normal exit");
}
public static void main(String args[]) {
try {
compute(1);
compute(20);
} catch (MyException e) {
System.out.println("Caught " + e);
}
}
}