Java中的异常处理简答题

1、运行时异常 vs 受检查异常

  • 运行时异常:程序运行时才可能出现(如数组越界、空指针),编译器不强制处理(不用try-catchthrows也能编译)。
  • 受检查异常:编译器强制要求处理的异常(如IO异常),必须使用try-catch捕获,或者用throws声明,否则编译报错

2、Java处理异常的机制

主要靠try-catch-finally(捕获处理)和throws(声明异常)

  • try:包裹可能出错的代码;catch:捕获特定异常并处理;finally:无论是否异常,都会执行(常用来关闭文件,连接等资源)
  • throws:在方法签名上声明“这个方法可能抛异常”,把异常处理的责任交给调用者

3、声明异常的目的与方式

  • 目的:告诉调用者“这个方法可能出什么异常”,让调用者提前处理
  • 声明方法:在方法签名后加throws 异常类名,多个异常用逗号分隔,例如:

    public void readFile() throws IOException{
        // here is method code
    }

4、异常分类与抛出

  • 分类:

    • Error:系统级严重错误(如栈溢出),程序几乎无法处理
    • Exception:程序可处理的异常,又分为:
    • 运行时异常(RuntimeException子类,如空指针):编译器不强制处理
    • 受检查异常(非RuntimeException的异常,如IO异常):编译器强制处理
  • 抛出异常:用throw关键字,例如

    throw new NullPointerException("空指针异常");

5、main方法中抛/捕Exception示例

public class Test {
        public static void main(String[] args) {
            try {
            // 抛出带字符参数的Exception对象
            throw new Exception("测试异常信息");
        } catch (Exception e) {
            // 捕获后打印构造器的字符参数
            System.out.println(e.getMessage());
        }
    }
}

6、自定义异常(求和超范围抛异常)

// 自定义异常类(受检查异常,继承Exception)
class RangeException extends Exception {
    public RangeException(String message) {
        super(message);
    }
}

// 测试类
public class SumDemo {
    // 求和方法,声明可能抛自定义异常
    public static int sum(int a, int b) throws RangeException {
        if (a > 100 || b > 100) { // 假设范围≤100
            throw new RangeException("数字超出范围(不能超过100)");
        }
        return a + b;
    }

    public static void main(String[] args) {
        try {
            sum(101, 50); // 触发异常
        } catch (RangeException e) {
            System.out.println("异常:" + e.getMessage());
        }
    }
}

7、getMessage()printStackTrace()的作用

  • getMessage():返回异常的详细信息字符串(即构造异常时传入的描述信息)
  • printStackTrace():打印 异常的堆栈跟踪信息(显示异常是在哪一行代码产生的,以及调用栈的顺序),方便调试找错误

8、无异常时try-catch的开销

如果没有异常产生,try-catch基本不会有额外系统开销(现代JVM对正常流程的try-catch优化很好。只有异常发生时,才会有创建异常对象的开销

© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容