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)