Java 在标准包 java.lang 中定义了几个异常类。
这些异常中最常见的是标准类型 RuntimeException 的子类。由于 java.lang 隐式导入到所有 Java 程序中,因此从 RuntimeException 派生的大多数异常都会自动可用。
Java 定义了与其各种类库相关的几种其他类型的异常。以下是 Java Unchecked RuntimeException 的列表。
序号 | 异常与描述 |
---|---|
1 | ArithmeticException 算术错误,例如被零除。 |
2 | ArrayIndexOutOfBoundsException 数组索引越界。 |
3 | ArrayStoreException 分配给不兼容类型的数组元素。 |
4 | ClassCastException 无效转换。 |
5 | IllegalArgumentException 用于调用方法的参数非法。 |
6 | IllegalMonitorStateException 非法监视器操作,例如等待未锁定的线程。 |
7 | IllegalStateException 环境或应用程序处于不正确的状态。 |
8 | IllegalThreadStateException 请求的操作与当前线程状态不兼容。 |
9 | IndexOutOfBoundsException 某些类型的索引越界。 |
10 | NegativeArraySizeException 使用负大小创建数组。 |
11 | NullPointerException 空引用的使用无效。 |
12 | NumberFormatException 字符串到字符串的无效转换数字格式。 |
13 | SecurityException 尝试违反安全性。 |
14 | StringIndexOutOfBounds 尝试在外部建立索引字符串的边界。 |
15 | UnsupportedOperationException 遇到了不支持的操作。 |
示例 1
在此示例中,我们通过除以创建错误值减 0。在这种情况下,将引发未经检查的异常。如果不检查,编译器不会抱怨并且程序将成功编译。一旦程序运行,就会抛出异常,JVM会拦截该异常并在打印最后一条语句之前终止程序。
package com.yxjc123;
public class ExcepTest {
public static void main(String args[]) {
int b = 0;
int c = 1/b;
System.out.println("c :" + c);
}
}
输出
Exception in thread "main" java.lang.ArithmeticException: / by zero
at com.yxjc123.ExcepTest.main(ExcepTest.java:8)
示例 2
在此示例中,我们正在处理未经检查的异常。第一步,我们通过将值除以 0 来生成错误。在这种情况下,将引发未经检查的异常。我们通过 ArithmeticException 进行处理。一旦程序运行,就会抛出异常,catch 块将拦截该异常并打印最后一条语句。
package com.yxjc123;
public class ExcepTest {
public static void main(String args[]) {
try {
int b = 0;
int c = 1/b;
System.out.println("c :" + c);
}
catch (ArithmeticException e) {
System.out.println("Exception thrown :" + e);
}
System.out.println("Out of the block");
}
}
输出
Exception thrown :java.lang.ArithmeticException: / by zero
Out of the block
以下是 java.lang 中定义的 Java 检查异常列表。
序号 | 异常与描述 |
---|---|
1 | ClassNotFoundException 找不到类。 |
2 | CloneNotSupportedException 尝试克隆未实现 Cloneable 接口的对象。 |
3 | IllegalAccessException 对类的访问被拒绝。 |
4 | InstantiationException 尝试创建抽象类的对象 |
5 | InterruptedException 一个线程有被另一个线程中断。 |
6 | NoSuchFieldException 请求的字段不存在。 |
7 | NoSuchMethodException 请求的方法不存在。 |
示例 3
在此示例中,我们展示了检查异常是由代码处理的,否则编译器会抱怨。每当一个方法抛出一个已检查的异常时,它必须处理该异常或声明 throws 异常语句,就像我们对 getName() 方法所做的那样。当我们尝试运行该方法时,JVM 会报告编译问题,如下面列出的输出所示:
package com.yxjc123;
public class ExcepTest {
public static void main(String args[]) {
ExcepTest excepTest = new ExcepTest();
excepTest.getName();
}
private String getName() throws NoSuchMethodException {
throw new NoSuchMethodException();
}
}
输出
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Unhandled exception type NoSuchMethodException
at com.yxjc123.ExcepTest.main(ExcepTest.java:7)