news 2026/8/29 9:15:07

【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/8/29 7:17:37

Qwen2.5-0.5B节省成本方案:替代高算力模型的可行性分析

Qwen2.5-0.5B节省成本方案&#xff1a;替代高算力模型的可行性分析 1. 为什么小模型正在成为新选择 你有没有遇到过这样的情况&#xff1a;想在公司内部部署一个AI助手&#xff0c;但一看到动辄需要A10或L40S显卡的部署要求就皱眉&#xff1f;或者想给客户做一个轻量级智能客…

作者头像 李华
网站建设 2026/8/21 16:00:05

DeepSeek-R1 vs Llama3-8B对比:蒸馏与原生模型评测

DeepSeek-R1 vs Llama3-8B对比&#xff1a;蒸馏与原生模型评测 1. 为什么这场对比值得你花5分钟读完 你是不是也遇到过这些困惑&#xff1a; 想在本地跑一个真正好用的对话模型&#xff0c;但显卡只有RTX 3060&#xff0c;连Llama3-70B想都不敢想&#xff1b;看到“DeepSeek…

作者头像 李华
网站建设 2026/8/25 2:04:32

ViGEmBus虚拟手柄驱动完全指南:从安装到高级应用

ViGEmBus虚拟手柄驱动完全指南&#xff1a;从安装到高级应用 【免费下载链接】ViGEmBus 项目地址: https://gitcode.com/gh_mirrors/vig/ViGEmBus 什么是ViGEmBus及其核心价值 ViGEmBus是一款创新的Windows内核级驱动程序&#xff0c;它能够将任何输入设备模拟成系统原…

作者头像 李华
网站建设 2026/8/21 16:00:33

YOLO26预测不显示结果?show/save参数设置教程

YOLO26预测不显示结果&#xff1f;show/save参数设置教程 你是不是也遇到过这样的情况&#xff1a;运行YOLO26推理脚本后&#xff0c;终端里明明打印出了检测框坐标和置信度&#xff0c;但屏幕上却什么都没弹出来&#xff1f;或者图片保存路径里空空如也&#xff0c;连个结果图…

作者头像 李华
网站建设 2026/8/21 16:00:06

x64dbg数据监视窗口使用指南

以下是对您提供的博文《x64dbg数据监视窗口深度技术解析》的 全面润色与专业重构版本 。本次优化严格遵循您的全部要求: ✅ 彻底去除AI痕迹,语言自然、老练、有“人味”,像一位深耕逆向多年的技术博主在深夜调试间隙写下的实战笔记; ✅ 打破模板化结构,取消所有程式化…

作者头像 李华
网站建设 2026/8/21 16:00:06

低成本高产出:麦橘超然在消费级显卡上的表现

低成本高产出&#xff1a;麦橘超然在消费级显卡上的表现 你是否试过在RTX 3060、4070甚至更入门的RTX 3050上跑Flux模型&#xff1f;不是“勉强能动”&#xff0c;而是真正生成出细节丰富、构图稳定、风格可控的高质量图像——不报错、不爆显存、不反复重启。这不是理想状态&a…

作者头像 李华