面试题答案
一键面试在Java中,当一个方法可能抛出多种不同类型的异常时,可以使用多个catch
块来捕获不同类型的异常。以下是代码示例:
public class ExceptionHandlingExample {
public static void main(String[] args) {
try {
// 可能抛出多种异常的代码
int result = divide(10, 0);
System.out.println("结果: " + result);
} catch (ArithmeticException e) {
System.out.println("捕获到算术异常: " + e.getMessage());
} catch (NumberFormatException e) {
System.out.println("捕获到数字格式异常: " + e.getMessage());
}
}
public static int divide(int a, int b) throws ArithmeticException, NumberFormatException {
if (b == 0) {
throw new ArithmeticException("除数不能为零");
}
// 假设这里有需要将字符串转换为数字的操作,可能抛出NumberFormatException
String numStr = "abc";
int num = Integer.parseInt(numStr);
return a / b;
}
}
捕获多种异常时的注意事项:
- 异常顺序:捕获异常时,子类异常的
catch
块应该放在父类异常的catch
块之前。因为如果先写父类异常的catch
块,那么子类异常也会被父类异常的catch
块捕获,导致子类异常的特定处理代码无法执行。例如,IOException
是FileNotFoundException
的父类,如果先写catch (IOException e)
,那么FileNotFoundException
也会被这个catch
块捕获,后续的catch (FileNotFoundException e)
就永远不会执行。 - 具体处理:每个
catch
块应该对相应类型的异常进行具体的处理,根据业务需求进行日志记录、错误提示等操作,以便于调试和维护。 - 避免过于宽泛的捕获:尽量避免捕获过于宽泛的异常类型(如
Exception
),除非你真的需要统一处理所有类型的异常。过于宽泛的捕获可能会掩盖真正的问题,使得调试变得困难。应该尽可能捕获具体的异常类型,这样可以更好地针对不同异常进行处理。