生成异常或在if中使用instanceof

时间:2015-01-27 10:28:53

标签: java performance exception

有时,为了避免使用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();
}

为什么

我发现了类似的问题herehere,但没有确切的

2 个答案:

答案 0 :(得分:2)

例外的更一般规则是如果它们也可以用更简单的结构表示,例如if,就可以避免它们。

生成异常很贵!它需要收集调用堆栈 - 并且根据您的应用程序复杂性 - 这可能是您堆上垃圾的可怕来源,需要由GC清理。

答案 1 :(得分:1)

general 中,更喜欢RTTI(即instanceof)而不是异常处理。

但是在这种情况下,您的测试完全没必要。既然看起来你只想要InputStream并且实际上并不关心它是哪种特定类型,那就写下:

InputStream is = fileItem.getInputStream();

如果您希望调用基类中不存在的特殊方法,则只需要专门使用InputStream的派生子类之一。