java - 在java中抛出异常重构
问题描述
我正在更改我的代码
Implementation 1 :
public User getUser(String userid) {
User user;
try {
// some code to get User
}catch(InterruptedException e) {
throw new CustomException();
}
return user;
}
至
Implementation 2 :
public User getUser(String userid) {
User user;
try {
// some code to get User
}catch(InterruptedException e) {
SomeHandlerInProject.throwCustomErr();
}
return user;
}
class SomeHandlerInProject {
public static void throwCustomErr() {
throw new CustomException();
}
}
实现 2 给出了用户可能未初始化的编译错误,有人可以帮助我在这里缺少什么,对我来说似乎很奇怪。
解决方案
编译器不知道SomeHandlerInProject.throwCustomErr()
总是抛出异常,所以就编译器代码分析而言,该方法可能会正常返回。
如果是这样,它的价值user
是多少?它没有值,所以编译器会抱怨它,因为它应该。请记住,SomeHandlerInProject
可以将类更改为不引发异常,而无需使用该getUser()
方法重新编译该类,因此编译器抱怨它是正确的。
即使您知道该方法总是抛出异常,您仍然必须编写代码,就好像它没有抛出异常一样,因此您必须为 赋值user
,或者通过初始化它,或者通过在catch
块中赋值给它。
如果目标是共享构建异常所需的逻辑,则应将辅助方法设为return
异常,而不是抛出异常,并让调用者执行throw
. 这样编译器就不会抱怨:
public User getUser(String userid) {
User user;
try {
// some code to get User
} catch (InterruptedException e) {
throw SomeHandlerInProject.buildCustomErr();
}
return user;
}
class SomeHandlerInProject {
public static CustomException buildCustomErr() {
return new CustomException();
}
}
堆栈跟踪保持不变,因为它是为调用堆栈创建快照的构造函数位置。
推荐阅读
- kubernetes - Eclipse Che 与 Istio 等自定义 Ingress
- php - 开发一个 php 页面并被重定向到 web 而不是 localhost?
- json - 为什么生成的 JSON 被截断?
- php - 在 Laravel 5.5 中通过 CURL 发布和接收
- json - 在 Azure 逻辑应用中解析具有多行相同 JSON 代码的文件
- r - 如何在 Shiny 书签中排除参数?
- ruby-on-rails - 仅在生产中,Sidekiq 启动延迟作业但不发送电子邮件
- node.js - Firestore 调用需要(平均)100/200 毫秒,对于对话流响应超时
- git - 是否可以为现有配置指定新的本地 git 存储库位置?
- css - 根据文本方向属性提供不同的 SCSS 文件