有时,为了避免使用if
,我创建了抛出异常来解析某些值的代码。
例如:如果您有一个输入字段,您可以在其中编写合作伙伴编号或合作伙伴名称进行搜索,我希望:
try {
Integer.parseInt(string);
// use the input as int
} catch (NumberFormatException) {
// use the input as a String
}
现在我遇到了类似的问题,但InputStream
。
InputStream is;
try {
is = (FileInputStream) fileItem.getInputStream();
} catch (ClassCastException e) {
is = (ByteArrayInputStream) fileItem.getInputStream();
}
我的问题是:最好是以这种方式抛出exception
或者像instanceof
一样使用if:
InputStream is;
if (fileItem.getInputStream() instanceof FileInputStream) {
is = (FileInputStream) fileItem.getInputStream();
} else if (fileItem.getInputStream() instanceof ByteArrayInputStream) {
is = (ByteArrayInputStream) fileItem.getInputStream();
}
为什么 ?
答案 0 :(得分:2)
例外的更一般规则是如果它们也可以用更简单的结构表示,例如if,就可以避免它们。
生成异常很贵!它需要收集调用堆栈 - 并且根据您的应用程序复杂性 - 这可能是您堆上垃圾的可怕来源,需要由GC清理。
答案 1 :(得分:1)
在 general 中,更喜欢RTTI(即instanceof
)而不是异常处理。
但是在这种情况下,您的测试完全没必要。既然看起来你只想要InputStream
并且实际上并不关心它是哪种特定类型,那就写下:
InputStream is = fileItem.getInputStream();
如果您希望调用基类中不存在的特殊方法,则只需要专门使用InputStream
的派生子类之一。