生成异常或在 if 中使用 instanceof

Generate an exception or use instanceof in an if

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

为什么

我发现了类似的问题 here or here 但没有确切的

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

生成异常的代价很高!它需要收集调用堆栈 - 并且取决于您的应用程序复杂性 - 仅此一项就可能成为堆上垃圾的可怕来源,需要由 GC 清理。

general 中,优先使用 RTTI(即 instanceof)而不是异常处理。

但是在这种情况下,您的测试是完全没有必要的。因为看起来你只想要一个 InputStream 而实际上并不关心它是哪种特定类型,只需写:

InputStream is = fileItem.getInputStream();

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