news 2026/5/5 18:10:41

【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/5/5 18:07:16

深度测评8个AI论文网站,专科生毕业论文格式规范必备!

深度测评8个AI论文网站&#xff0c;专科生毕业论文格式规范必备&#xff01; AI 工具如何助力论文写作&#xff1f; 在当今的学术环境中&#xff0c;AI 工具已经成为许多学生和研究者不可或缺的助手。特别是对于专科生而言&#xff0c;面对毕业论文的压力&#xff0c;选择一款…

作者头像 李华
网站建设 2026/5/5 18:06:14

TurboDiffusion常见报错:nvidia-smi监控异常处理指南

TurboDiffusion常见报错&#xff1a;nvidia-smi监控异常处理指南 1. 为什么需要关注nvidia-smi监控异常&#xff1f; 在使用TurboDiffusion进行视频生成时&#xff0c;你可能遇到过这样的情况&#xff1a;点击“生成”按钮后界面卡住不动&#xff0c;终端日志停止刷新&#x…

作者头像 李华
网站建设 2026/5/5 18:06:14

突破限制:3个步骤实现百度网盘下载加速的实用指南

突破限制&#xff1a;3个步骤实现百度网盘下载加速的实用指南 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 还在忍受百度网盘令人抓狂的下载速度&#xff1f;本文将介绍一款…

作者头像 李华
网站建设 2026/5/5 17:55:23

告别繁琐配置!用ResNet18 OCR镜像实现证件文字提取全流程

告别繁琐配置&#xff01;用ResNet18 OCR镜像实现证件文字提取全流程 你是否还在为提取身份证、营业执照、合同扫描件里的文字而反复折腾&#xff1f;安装PaddleOCR、编译OpenCV、调试CUDA版本、修改配置文件……一连串操作下来&#xff0c;半小时过去了&#xff0c;连第一行字…

作者头像 李华