例如,我需要使用getFoo()方法获取Foo对象:
Foo foo = getFoo();
在此之后,我想处理getFoo()没有成功返回Foo对象的情况。这又包括两种情况:
理想情况下,我希望getFoo()抛出异常而不是返回空结果,但是有时这可能是对我不拥有的另一个包中的方法的调用。
这些是我能想到的方法:
1.重复的处理代码
Foo foo = null;
try {
foo = getFoo();
} catch (ResourceNotFoundException ex) {
logger.warn("blablabla");
foo = defaultFoo;
someOtherComplicatedStuff();
}
if (null == foo) {
logger.warn("blablabla");
foo = defaultFoo;
someOtherComplicatedStuff();
}
这绝对不是一个好主意。
2.将处理逻辑移至单个功能
Foo foo = null;
try {
foo = getFoo();
} catch (ResourceNotFoundException ex) {
handleNullFoo(var1, var2, var3, var4);
}
if (null == foo) {
handleNullFoo(var1, var2, var3, var4);
}
问题在于逻辑可能使用很多局部变量。将这些变量传递给外部函数没有多大意义。更糟糕的是,在此过程中可能需要修改某些变量。我认为修改函数中的参数不是一个好习惯,更不用说参数是原始类型时可能引起的问题。
3.抛出一个假异常
Foo foo = null;
try {
foo = getFoo();
if (null == foo) {
throw new ResourceNotFoundException();
}
} catch (ResourceNotFoundException ex) {
logger.warn("blablabla");
foo = defaultFoo;
someOtherComplicatedStuff();
}
到目前为止,这是最干净的方法,但更像是一种hack。在异常类不属于的包中抛出ResourceNotFoundException可能不合适。由于人们可能没有意识到异常是在函数内部处理的,因此它也降低了代码的可读性。
那么,您有什么建议?
非常感谢你!
最佳答案
这是另一种选择:
Foo foo = null;
try {
foo = getFoo();
} catch (ResourceNotFoundException ex) {
//TODO: log exception?
foo = null;
}
if (null == foo) {
logger.warn("blablabla");
foo = defaultFoo;
someOtherComplicatedStuff();
}
注意,
foo = null;
子句中的catch
几乎肯定是不必要的。仅当foo = getFoo()
之后有一些可以抛出ResourceNotFoundException
的代码时才需要。关于java - 如何在Java中统一处理“Exception或null”情况?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14387434/