例如,我需要使用 getFoo() 方法获取一个 Foo 对象:
Foo foo = getFoo();
在此之后,我想处理 getFoo() 没有成功返回 Foo 对象的情况。这又包括两种情况:
- getFoo() 抛出异常。
- getFoo() 的返回结果为 null、空字符串、0 或任何应视为“空结果”的内容。
理想情况下,我希望 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 可能不合适。它还降低了代码的可读性,因为人们可能没有意识到异常是在函数内部处理的。
那么,你的建议是什么?
非常感谢你!