还记得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("外面");

结果我们发现,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 func
tion 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。最后,我们将计算结果打印出来。