如果你认为有可能获得空指针异常,你应该使用if语句来确保变量不为null,还是应该捕获异常?
我没有看到任何区别,因为你可以把你的逻辑处理if语句或catch块中的空指针,那么哪一个是最好的做法?
在一些地方(这里和这里)已经说过,Python强调"请求宽恕而不是许可"(EAFP)应该通过以下观点来缓和,即异常只应在真正特殊情况下调用.考虑以下内容,我们将弹出并推送优先级队列,直到只剩下一个元素:
import heapq
...
pq = a_list[:]
heapq.heapify(pq)
while True:
min1 = heapq.heappop(pq)
try:
min2 = heapq.heappop(pq)
except IndexError:
break
else
heapq.heappush(pq, min1 + min2)
# do something with min1
Run Code Online (Sandbox Code Playgroud)
异常仅在len(a_list)循环的迭代中引发一次,但它并不是特别的,因为我们知道它最终会发生.这个设置使我们a_list无需检查是否空了很多次,但(可能)它比使用显式条件更不易读.
对这种非特殊程序逻辑使用异常的共识是什么?
我必须解析一个可以采用十六进制值或其他非十六进制值的字符串
0xff,0x31或者A,PC,label,等等.
我使用此代码来划分两种情况:
String input = readInput();
try {
int hex = Integer.decode(input);
// use hex ...
} catch (NumberFormatException e) {
// input is not a hex, continue parsing
}
Run Code Online (Sandbox Code Playgroud)
这段代码可以被视为"丑陋"还是难以阅读?还有其他(可能更优雅)的解决方案吗?
编辑:我想澄清(在我的情况下)错误的输入不存在:我只需要区分它是否是十六进制数.而且为了完整起见,我正在为DCPU-16制作一个简单的装配器.
java parsing exception-handling exception numberformatexception
我试图了解使用Java catch块的正确方法。我应该在那里写业务逻辑还是仅抑制错误?
我的问题在某种程度上与此有关。请检查一下。
我的理解:
如果未检查到 异常,则最好的方法是用以下方式编写代码:
Integer n = null;
try {
n = Integer.parseInt(reader.readLine());
}
catch(NumberFormatException e){
log.error('Can't parse string');
}
if (n == null) {
n = 0;
}
Run Code Online (Sandbox Code Playgroud)
并避免这样的代码:
Integer n = null;
try {
n = Integer.parseInt(reader.readLine());
}
catch(NumberFormatException ignored){
n = 0;
}
Run Code Online (Sandbox Code Playgroud)
我的问题:
但是它将被检查的异常是什么,并且我在未找到搜索元素的情况下使用例如数据库异常抛出NoSuchElement异常:
User user = null;
try {
user = User.findById(userId);
} catch (NoSuchCategoryException e) {
log.error('User {} doesn't exist.', userId);
user = new User();
}
user.setUsername('someName'); …Run Code Online (Sandbox Code Playgroud) 我正在研究将我们的项目转换为 Spring Boot 应用程序的概念验证。我有一个具有两种方法的存储库类:保存和查找。
@Repository
public class UserDataRepo {
private EntityManager em;
public boolean save(UserDataModel model) {
try {
UserDataModel existingModel = find(model.getTable(), model.getFieldName();
model.setId(existingModel.getId());
this.em.merge(model);
this.em.flush();
return false;
} catch (NoResultException e) {
this.em.persist(model);
this.em.flush();
return true;
}
}
public UserDataModel find(String table, String field) {
Query query = this.em.createQuery(FIND_USERDATA_STATEMENT);
query.setParameter("table", table);
query.setParameter("fieldName", field);
return (UserDataModel) query.getSingleResult(); // throws NoResultException
}
}
Run Code Online (Sandbox Code Playgroud)
在我的 Spring Boot 应用程序类中,我添加了@EnableJpaRepositories, @EnableTransactionManagement。我的应用程序启动正常,没有任何错误。但正如你所看到的,save方法依赖于find方法来确定是合并还是持久。如果没有记录,find 方法将抛出 NoResultException。我观察到它永远不会落入 save 方法的 catch 块内。Spring Boot 只是抛出一个错误,指出 NoResultException。 …