Java中异常分为哪两种

在Java编程中,异常是指在程序执行过程中发生的错误或异常情况,它会导致程序出现意外的行为。为了处理这些异常,Java提供了异常处理机制。Java中的异常分为两种:受查异常(Checked Exception)和非受查异常(Unchecked Exception)。

受查异常(Checked Exception)

受查异常是指在代码编译阶段就必须处理的异常。它们通常表示程序可以预料到的错误,需要程序员在编写代码时进行处理,以避免程序出现问题。

受查异常是Exception类及其子类的实例。在Java中,受查异常的子类分为两种:可检查异常和编译时异常。

可检查异常(Checked Exception)

可检查异常是指在方法声明中包含throws关键字,并且调用该方法时,必须显式地处理或继续抛出该异常。这些异常通常表示外部条件的错误或意外情况,程序员应该提前处理它们。

下面是一个简单的示例,演示了如何处理可检查异常:

public class FileHandler {
    public static void main(String[] args) {
        try {
            FileReader file = new FileReader("input.txt");
            BufferedReader br = new BufferedReader(file);
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
            br.close();
        } catch (FileNotFoundException e) {
            System.out.println("文件未找到!");
        } catch (IOException e) {
            System.out.println("读取文件出错!");
        }
    }
}

上述代码中,我们打开一个名为"input.txt"的文件,并逐行读取文件内容。在读取文件的过程中,可能会抛出FileNotFoundException和IOException异常。我们使用try-catch块来捕获并处理这些异常。如果文件未找到,将打印"文件未找到!"的消息;如果读取文件出错,将打印"读取文件出错!"的消息。

编译时异常(Compile-time Exception)

编译时异常是指在代码编译阶段就必须处理的受查异常。它们通常表示编译器无法处理的错误,需要在编写代码时进行处理。

下面是一个示例,演示了如何处理编译时异常:

public class Division {
    public static void main(String[] args) {
        try {
            int result = divide(10, 0);
            System.out.println("Result: " + result);
        } catch (ArithmeticException e) {
            System.out.println("除数不能为零!");
        }
    }
    
    public static int divide(int dividend, int divisor) throws ArithmeticException {
        return dividend / divisor;
    }
}

上述代码中,我们定义了一个divide方法,用于计算两个数的商。在divide方法中,如果除数为零,将抛出ArithmeticException异常。在main方法中,我们调用divide方法,并使用try-catch块捕获并处理该异常。如果除数为零,将打印"除数不能为零!"的消息。

非受查异常(Unchecked Exception)

非受查异常是指不需要在代码编写阶段显式处理的异常。它们通常表示程序的错误或逻辑错误,是由程序员编码错误或运行环境导致的。

非受查异常是RuntimeException类及其子类的实例。它们不需要在方法声明中包含throws关键字,也不需要在调用方法时显式地处理或继续抛出该异常。

下面是一个示例,演示了如何处理非受查异常:

public class Array {
    public static void main(String[] args) {
        try {
            int[] array = new int[5];
            int value = array[10];
            System.out.println("Value: " + value);
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("数组索引越界!");
        }
    }
}

上述代码中,我们定义了一个长度为5的数组,然后尝试访问索引为10的元素。由于数组的长度为5,所以索引为10的元素不存在,将抛出ArrayIndexOutOfBoundsException异常。在main方法中,我们使用try-catch块捕获并处理该异常。