news 2026/4/17 21:20:50

【Java】java中throws与try catch区别

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Java】java中throws与try catch区别

throwstry-catch都是 Java 中处理异常的方式,但它们的用途和用法有本质区别:

1.try-catch(异常捕获)

在方法内部处理异常

publicvoidmethod(){try{// 可能抛出异常的代码FileInputStreamfis=newFileInputStream("test.txt");}catch(FileNotFoundExceptione){// 在方法内部处理异常System.out.println("文件未找到:"+e.getMessage());e.printStackTrace();}finally{// 可选,无论是否异常都会执行System.out.println("清理资源");}}

2.throws(异常声明)

将异常抛给调用者处理

publicvoidmethod()throwsFileNotFoundException{// 不处理异常,只是声明可能会抛出FileInputStreamfis=newFileInputStream("test.txt");// 使用资源的代码...}

主要区别对比

特性try-catchthrows
位置方法内部方法声明处
处理者当前方法自己处理调用者处理
语法需要 catch 块只需声明异常类型
资源释放可以在 finally 或 try-with-resources 中释放无法自动释放资源
控制流异常后可以继续执行异常会中断当前方法

实际应用场景

适合使用 try-catch 的情况:

publicvoidreadConfigFile(){try{Propertiesprops=newProperties();props.load(newFileReader("config.properties"));// 处理配置...}catch(IOExceptione){// 使用默认配置useDefaultConfig();}}// 当前方法就能完全处理异常

适合使用 throws 的情况:

publicvoidloadUserData(Stringfilename)throwsIOException,DataFormatException{// 读取文件Stringdata=readFile(filename);// 可能抛IOException// 解析数据if(!isValidFormat(data)){thrownewDataFormatException("数据格式错误");}// 处理数据...}// 让调用者决定如何处理这些异常

最佳实践结合使用

示例:分层处理异常

// 数据访问层 - 抛出原始异常publicUsergetUserById(intid)throwsSQLException{Connectionconn=getConnection();// 数据库操作...// 出现异常时抛给业务层}// 业务层 - 转换异常类型publicUserDTOgetUserInfo(intid)throwsBusinessException{try{Useruser=userDao.getUserById(id);returnconvertToDTO(user);}catch(SQLExceptione){// 将技术异常转换为业务异常thrownewBusinessException("查询用户失败",e);}}// 表示层/控制器层 - 最终处理@GetMapping("/user/{id}")publicResponseEntity<?>getUser(@PathVariableintid){try{UserDTOuser=userService.getUserInfo(id);returnResponseEntity.ok(user);}catch(BusinessExceptione){// 向用户返回友好错误信息returnResponseEntity.status(404).body("用户不存在");}}

经验法则:

  1. 底层方法(如工具类、DAO):多用throws,避免吞没异常
  2. 业务方法:适当使用 try-catch,将技术异常转换为业务异常
  3. 最终调用者(如 main、Controller):一定要处理所有异常
  4. 检查性异常:必须处理(try-catch 或 throws)
  5. 运行时异常:通常不强制处理,但应该考虑捕获

try-with-resources(推荐方式)

publicvoidreadFile(Stringpath)throwsIOException{// 自动关闭资源,同时可以声明异常try(BufferedReaderbr=newBufferedReader(newFileReader(path))){Stringline;while((line=br.readLine())!=null){System.out.println(line);}}// 不需要显式 catch,资源会自动关闭}

简单总结:

  • try-catch:自己处理,适用于知道如何处理异常的场景
  • throws:交给别人处理,适用于不知道如何处理的场景
  • 通常结合使用:底层 throws,高层 catch 并转换/处理
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/31 0:37:42

革命性虚拟手柄驱动:ViGEmBus如何解决90%的游戏设备兼容难题

革命性虚拟手柄驱动&#xff1a;ViGEmBus如何解决90%的游戏设备兼容难题 【免费下载链接】ViGEmBus 项目地址: https://gitcode.com/gh_mirrors/vig/ViGEmBus 游戏玩家的终极痛点&#xff1a;为什么你的手柄总是"水土不服"&#xff1f; 当你兴致勃勃地启动新…

作者头像 李华
网站建设 2026/4/18 7:56:27

手把手教你学Simulink——风电电机控制场景实例:基于Simulink的永磁直驱风电系统无位置传感器控制仿真

目录 手把手教你学Simulink 一、引言:为什么“永磁直驱风电系统需要无位置传感器控制”? 二、系统架构总览 三、为什么选择“高频注入法”? 四、高频注入法原理(旋转高频电压注入) 1. 注入高频电压 2. 提取高频电流响应 3. 位置误差提取 五、系统参数设定(3 MW …

作者头像 李华
网站建设 2026/4/18 7:04:05

Sambert支持RESTful接口?API网关集成部署实战

Sambert支持RESTful接口&#xff1f;API网关集成部署实战 1. 开箱即用的多情感中文语音合成服务 你有没有遇到过这样的场景&#xff1a;产品需要快速接入中文语音播报功能&#xff0c;但自研TTS系统动辄几周开发周期&#xff0c;调用公有云API又担心数据合规和延迟问题&#…

作者头像 李华
网站建设 2026/4/18 8:02:34

在 NDC London 2026 与 ABP.IO 相见

我们很高兴地宣布&#xff0c;ABP.IO 将赞助 NDC London 2026。这也让 2026 年的开始&#xff0c;对我们来说格外值得期待。NDC London 2026 将于 2026 年 1 月 26 日至 30 日 在 女王伊丽莎白二世会议中心 举行。这是一场为期 5 天 的软件开发者大会&#xff0c;届时将汇聚 90…

作者头像 李华
网站建设 2026/3/12 4:37:18

当 AI 学会“造沙箱“:OpenSandbox 如何让大模型安全地执行代码

❝让 AI 写代码容易&#xff0c;让 AI 安全地运行代码&#xff1f;这才是真正的技术硬菜。你有没有想过这样一个场景&#xff1a;你让 ChatGPT 或 Claude 帮你写了一段 Python 爬虫脚本&#xff0c;它写得漂漂亮亮&#xff0c;但你复制到本地一运行——"rm -rf /"——…

作者头像 李华
网站建设 2026/4/18 2:03:23

Z-Image-Turbo日志分析实战:定位图像生成失败的根本原因

Z-Image-Turbo日志分析实战&#xff1a;定位图像生成失败的根本原因 1. 问题来了&#xff1a;图片没生成出来&#xff0c;该看哪儿&#xff1f; 你兴冲冲地输入了一段精雕细琢的提示词&#xff0c;点击“生成”&#xff0c;UI界面转了几秒&#xff0c;进度条停了&#xff0c;…

作者头像 李华