添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

还记得2年前见过这个问题,当时没太在意,这次写 demo 复现了这个问题。 Java 运行时异常能捕捉吗?

背景:比如文件上传后的删除操作 delete id 不存在抛出运行时异常。 删除方法是 public void delete() ,因为 MVC 中的 Model 层没有声明异常, service 中的 delete 调用 dao 中的 delete dao 中的 delete 去调用 xml 或者数据库 delete 操作。现在前端需要接收到删除成功和失败的提示,后端删除失败是会有运行时异常的,最后需要给前端返回类似 {return:"ok"} 或者 {return:"你的异常信息"}

方法大概两种,第一就是删除数据失败直接返回 boolean 类型值,方法改为 public boolean delete() ,第二种就是把运行时异常一层层上抛到 Controller 进行 try-catch 处理,在 catch 块中返回错误的 json 数据 {return:"你的异常信息"}

思考的问题来了,运行时异常一层层往上抛出, try-catch 能接住吗?如果接不住你就没法处理失败信息传给前端了。那咱们就来试一试。

public class HelloWorld{
	public static void test() {
		try {
			throw new RuntimeException("test RuntimeException123");
		} catch (RuntimeException e) {
			System.out.println("里面");
			throw new RuntimeException(e.getMessage());
		} catch (Exception f) {
			System.out.println("ff");
	public static void test2() {
		System.out.println("执行到test2");
		test();
		System.out.println("test()抛异常后面还会执行吗?");
	public static void main(String[] args) {
		try {
			test2();
		} catch(Exception e) {
			e.printStackTrace();
			System.out.println("外面");

java运行时异常能捕捉吗
结果我们发现,test()中,运行时异常被try-catch接住了,然后继续往上抛,在test2()中没有try-catch块,结果在main方法还是能接住。


得出结论:
  运行时异常不需要throws声明,即使是方法层层调用,也能抛出到最上层后再用try-catch捕捉。所以,运行时异常可以捕捉,但是没必要捕捉,除非功能特殊需要。

  说到这里,我得再提示一下,像这种运行时异常RuntimeException是非受检查异常,编译器不能提前预测。在SpringBoot中自定义异常进行统一异常处理时,如果你的自定义异常是extends Exception,那么你每次throw抛出异常编译器都会提示要try-catch或者throws声明,特别麻烦,如果我们只是需要最终只是在统一异常处理类里面进行处理,返回给前端统一的json异常信息,那么完全可以将自定义异常extends RuntimeException,这样每次throw new "自定义异常"就不用try-catch或者throws声明了,因为RuntimeException是可以捕捉且编译器不提前预测的,这样就不会抛出异常时爆红了。


欢迎一键三连~
有问题请留言,大家一起探讨学习
----------------------Talk is cheap, show me the code-----------------------
JavaScript 中的 try-catch 能否捕获异步错误的探究 try-catch 是用来捕获同步错误的,而以下代码却是可以捕捉到异步错误的: async function run() { try { let a = await Promise.reject(new Error("Oops!"));//【0】 } catch (error) { console.log(error.message); // "Oops!"
Error类称为错误类。它表示Java运行时产生的系统内部错误或资源耗尽的错误是比较严重的。 Exception类称为异常类,它表示程序本身还可以处理的错误。 处理编译时异常有俩种方式: 使用try…… eatch语句对异常进行捕获处理。 使用throws关键字声明抛出异常,让调用者对其处理。 RuntimeException类及其子类都是运行时异常运行时异常是在程序运行时Java虚拟...
由于Android设备各异,第三方定制的Android系统也非常多,我们不可能对所有的设备场景都进行测试,因而开发一款完全无bug的应用几乎是不可能的任务,那么当应用在用户的设备上Force Close时,我们是不是可以捕获这个错误,记录用户的设备信息,然后让用户选择是否反馈这
Java中所有异常的父类是Throwable类,在Throwable类下有两大子类: 一个是Error类,指系统错误异常,例如:VirtualMachineError 虚拟机错误,ThreadDeath 线程死锁。一般如果是Error类的异常的话,就是程序的硬伤,就好比是工厂里断水断电,机器损坏了。 另一个是Exception类,指编码、环境、用户操作输入等异常,这个是比较常见的异常类,Exc...
捕获RuntimeException runtimeException在java中是不被检查的,如何让抛出的runtimeException能够捕获到,并进行相应的处理。 //调用可能出现runtimeException的方法 XXXXXXXXXXXXXXXX }catch(Exception e){ throw e.getCause(); }catch(Throwable th){ //进行相应的捕获之后的处理 XXXXXXXXXXXXXXXXXX public class Calculator { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("请输入一个表达式,支持加减乘除运算,例如 2 + 3:"); String input = scanner.nextLine().trim(); String[] parts = input.split("\\s+"); try { if (parts.length != 3) { throw new IllegalArgumentException("输入的表达式不合法,请输入一个包含两个操作数和一个运算符的表达式,例如 2 + 3"); double num1 = Double.parseDouble(parts[0]); double num2 = Double.parseDouble(parts[2]); char operator = parts[1].charAt(0); double result; switch (operator) { case '+': result = num1 + num2; break; case '-': result = num1 - num2; break; case '*': result = num1 * num2; break; case '/': result = num1 / num2; break; default: throw new IllegalArgumentException("不支持的运算符,请输入加减乘除中的一个运算符"); System.out.println("计算结果为:" + result); } catch (NumberFormatException e) { System.out.println("输入的操作数不合法,请输入一个有效的数值"); } catch (IllegalArgumentException e) { System.out.println(e.getMessage()); } catch (Exception e) { System.out.println("发生了未知错误,请检查输入的表达式是否正确"); 在代码中,我们使用了Scanner来读取用户输入的表达式,然后使用split方法将其分割成操作数和运算符。接着,我们使用try-catch捕捉可能出现的异常,包括NumberFormatException和IllegalArgumentException。其中,NumberFormatException表示输入的操作数不合法,例如输入了一个字符串;IllegalArgumentException表示输入的表达式不合法,例如只有一个操作数或者没有运算符。如果出现其他未知异常,我们就打印出一个错误提示。 在try代码中,我们首先检查输入的表达式是否合法,如果不合法就抛出一个IllegalArgumentException。然后,我们将操作数和运算符分别解析出来,进行相应的运算。如果出现不支持的运算符,我们就抛出一个IllegalArgumentException。最后,我们将计算结果打印出来。