MST

星途 面试题库

面试题:Java异常处理中等难度面试题

在Java中,阐述自定义异常类继承自Exception和继承自RuntimeException有何区别,并举例说明在何种场景下分别使用这两种继承方式
40.8万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

区别

  1. 检查异常(继承自Exception)
    • 这种异常属于受检异常(Checked Exception),即当一个方法可能抛出继承自Exception(不包括继承自RuntimeException)的异常时,该方法必须使用throws关键字声明抛出该异常,或者在方法内部捕获处理该异常。
    • 它表示程序运行过程中可能出现的、但合理的异常情况,调用者应该知道如何处理这类异常。
  2. 运行时异常(继承自RuntimeException)
    • 这类异常属于非受检异常(Unchecked Exception),方法不需要声明抛出这类异常,调用者也可以不捕获处理这类异常。
    • 它通常表示程序中的逻辑错误,如空指针引用、数组越界等,这类异常是程序员在编码过程中应该避免的。

场景举例

  1. 继承自Exception的场景: 假设我们有一个读取文件的方法。由于文件可能不存在、没有读取权限等原因会抛出异常,这种异常是程序运行时合理可能出现的情况,调用者应该有相应的处理逻辑。
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class FileReadingExample {
    public static String readFile(String filePath) throws FileReadException {
        StringBuilder content = new StringBuilder();
        try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
            String line;
            while ((line = br.readLine()) != null) {
                content.append(line).append("\n");
            }
        } catch (IOException e) {
            throw new FileReadException("Error reading file: " + filePath, e);
        }
        return content.toString();
    }
}

class FileReadException extends Exception {
    public FileReadException(String message, Throwable cause) {
        super(message, cause);
    }
}

在调用readFile方法时,调用者必须处理FileReadException异常,例如:

public class Main {
    public static void main(String[] args) {
        try {
            String content = FileReadingExample.readFile("nonexistentfile.txt");
            System.out.println(content);
        } catch (FileReadException e) {
            System.out.println("Caught FileReadException: " + e.getMessage());
        }
    }
}
  1. 继承自RuntimeException的场景: 假设我们有一个计算两个整数相除的方法,当除数为0时,这是一个逻辑错误,应抛出运行时异常。
public class DivisionExample {
    public static int divide(int dividend, int divisor) {
        if (divisor == 0) {
            throw new DivisionByZeroException("Cannot divide by zero");
        }
        return dividend / divisor;
    }
}

class DivisionByZeroException extends RuntimeException {
    public DivisionByZeroException(String message) {
        super(message);
    }
}

调用divide方法时,调用者可以选择不捕获DivisionByZeroException异常,因为这是程序逻辑错误导致的异常,在正常情况下不应发生。

public class Main {
    public static void main(String[] args) {
        int result = DivisionExample.divide(10, 0);
        System.out.println(result);
    }
}

上述代码在运行时会抛出DivisionByZeroException异常,但调用者没有强制捕获处理它。如果在实际应用中,程序员应该检查除数是否为0,避免出现这种运行时异常。