我是通过
实现的try {
element = actualList.find("foo");
anotherList.append(element);
}
catch (NotInListException e) {
}
这种用法好吗?或者我应该用这样的smth重构它:
if ((element = actualList.find("foo")) != null) {
anotherList.append(element);
}
答案 0 :(得分:2)
如果忽略异常处理程序给出的小的运行时间惩罚,这是一种风格问题。
可以设计类似
的堆栈类型try{
while(true){
try{
stack.pop();
catch(StackElement e){
processElement(e);
}
}
catch(EmptyStackException ese){
// probably not much to do here.
}
出于可读性和常识的原因,共识是通常if
条件使事情更容易理解。异常机制应该用于特殊情况,而不是用于常规流量控制。
在您的特定查找示例中,您有两种情况,其中没有一种情况与众不同。因此可能不需要例外。
1 - 没有找到该元素。
2 - 找到了元素。
案例2需要特别注意,因为您的find版本也想要返回实际元素。
1 || 2是布尔情况。所以这不应该是一个元素。案例2的find()应该是一个元素。
我总是不喜欢非值的返回null。它会造成难看的代码。回忆一下
void f(BufferedReader br){
String line;
while( (line = br.readLine()) != null)
最好是将布尔值与元素分开。
if( list.has(foo) ){
E element = list.get(foo);
}
答案 1 :(得分:1)
你的第二个例子更清晰,更容易阅读。您没有提供任何详细信息,但我认为在您的搜索中找不到值不应被视为特殊情况。
使用Java 8,您甚至可以考虑返回Optional
并添加如下结果:
actualList
.find("foo")
.ifPresent(v -> anotherList.add(v));
答案 2 :(得分:0)
我相信你的代码应遵循逻辑主体。如果问题是抛出或不抛出NotInListException,那么要回答的几个问题是:元素不在列表中是一个例外情况吗?我们真的希望该元素在列表中吗?如果答案是肯定的,那么元素不在列表中的情况是例外的,因此抛出异常是有道理的。否则它应该是if-else逻辑。
答案 3 :(得分:-1)
我建议写这样的东西:
List<String> elements; //get the list
try{
if(elements.contains("foo")){
anotherList.add("foo");
}else{
throw new NotInListException("Element not present");
}
}catch(NotInListException ex){
//do something
}