Java运行时异常try-catch块能捕捉到吗

2023-12-27 19:30

本文主要是介绍Java运行时异常try-catch块能捕捉到吗,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

背景:比如文件上传后的删除操作deleteid不存在抛出运行时异常。 删除方法是public void delete(),因为MVC中的Model层没有声明异常,service中的delete调用dao中的deletedao中的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-----------------------

这篇关于Java运行时异常try-catch块能捕捉到吗的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/544107

相关文章

Java中JSON格式反序列化为Map且保证存取顺序一致的问题

《Java中JSON格式反序列化为Map且保证存取顺序一致的问题》:本文主要介绍Java中JSON格式反序列化为Map且保证存取顺序一致的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录背景问题解决方法总结背景做项目涉及两个微服务之间传数据时,需要提供方将Map类型的数据序列化为co

Java Lambda表达式的使用详解

《JavaLambda表达式的使用详解》:本文主要介绍JavaLambda表达式的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、前言二、Lambda表达式概述1. 什么是Lambda表达式?三、Lambda表达式的语法规则1. 无参数的Lambda表

java中Optional的核心用法和最佳实践

《java中Optional的核心用法和最佳实践》Java8中Optional用于处理可能为null的值,减少空指针异常,:本文主要介绍java中Optional核心用法和最佳实践的相关资料,文中... 目录前言1. 创建 Optional 对象1.1 常规创建方式2. 访问 Optional 中的值2.1

Spring Boot 整合 Apache Flink 的详细过程

《SpringBoot整合ApacheFlink的详细过程》ApacheFlink是一个高性能的分布式流处理框架,而SpringBoot提供了快速构建企业级应用的能力,下面给大家介绍Spri... 目录Spring Boot 整合 Apache Flink 教程一、背景与目标二、环境准备三、创建项目 & 添

Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析

《Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析》InstantiationAwareBeanPostProcessor是Spring... 目录一、什么是InstantiationAwareBeanPostProcessor?二、核心方法解

深入解析 Java Future 类及代码示例

《深入解析JavaFuture类及代码示例》JavaFuture是java.util.concurrent包中用于表示异步计算结果的核心接口,下面给大家介绍JavaFuture类及实例代码,感兴... 目录一、Future 类概述二、核心工作机制代码示例执行流程2. 状态机模型3. 核心方法解析行为总结:三

Spring @RequestMapping 注解及使用技巧详解

《Spring@RequestMapping注解及使用技巧详解》@RequestMapping是SpringMVC中定义请求映射规则的核心注解,用于将HTTP请求映射到Controller处理方法... 目录一、核心作用二、关键参数说明三、快捷组合注解四、动态路径参数(@PathVariable)五、匹配请

Java -jar命令如何运行外部依赖JAR包

《Java-jar命令如何运行外部依赖JAR包》在Java应用部署中,java-jar命令是启动可执行JAR包的标准方式,但当应用需要依赖外部JAR文件时,直接使用java-jar会面临类加载困... 目录引言:外部依赖JAR的必要性一、问题本质:类加载机制的限制1. Java -jar的默认行为2. 类加

Java进程CPU使用率过高排查步骤详细讲解

《Java进程CPU使用率过高排查步骤详细讲解》:本文主要介绍Java进程CPU使用率过高排查的相关资料,针对Java进程CPU使用率高的问题,我们可以遵循以下步骤进行排查和优化,文中通过代码介绍... 目录前言一、初步定位问题1.1 确认进程状态1.2 确定Java进程ID1.3 快速生成线程堆栈二、分析

Swagger在java中的运用及常见问题解决

《Swagger在java中的运用及常见问题解决》Swagger插件是一款深受Java开发者喜爱的工具,它在前后端分离的开发模式下发挥着重要作用,:本文主要介绍Swagger在java中的运用及常... 目录前言1. Swagger 的主要功能1.1 交互式 API 文档1.2 客户端 SDK 生成1.3