为何divide函数未在try块调用时,未触发未捕获ArithmeticException报错?
问题原因与解决办法
为啥直接调用不报错?
你用的ArithmeticException是Java里的运行时异常,这类异常属于“编译器不会强制要求处理”的类型——也就是说,哪怕你不写try-catch,编译器也不会拦着你,只有在运行时真的触发异常(比如除数为0)的时候才会报错。这就是为啥你直接调用divide没出现编译错误的原因。
怎么强制必须在try块里调用?
要实现这个限制,得自定义一个检查型异常(也就是编译器会盯着你处理的异常)。具体做法如下:
修改后的代码示例
class Main { public static void main(String[] args) { // 这里必须套try-catch,不然编译器直接报错 try { System.out.println(Main.divide(5.0f, 2.0f)); System.out.println(divide(5.0f, 2.0f)); } catch (DivideByZeroException e) { System.out.println(e.getMessage()); } } static float divide(float x, float y) throws DivideByZeroException { if (y == 0) throw new DivideByZeroException("Cannot divide by 0!"); else return x/y; } } // 自定义检查型异常,直接继承Exception即可 class DivideByZeroException extends Exception { public DivideByZeroException(String message) { super(message); } }
原理说明
自定义的DivideByZeroException继承自Exception(而非RuntimeException),属于检查型异常。此时编译器会强制要求所有调用divide的地方,要么用try-catch捕获异常,要么在调用方法上声明抛出这个异常,刚好满足你“必须在try块中调用”的限制需求。
内容的提问来源于stack exchange,提问作者Mr. Developer
相关产品推荐
相关产品推荐

