instanceof失败时适当的异常

时间:2018-10-03 08:58:55

标签: java exception exception-handling

instanceof失败时什么是适当的异常。像这样:

if (user instanceof CustomerModel)
    {
            some logic...
    }
    else
    {
        throw new ClassCastException("Current user is not of type Customer");
    }
}

我要使用ClassCastException,但是我不能100%地确定在这种情况下它是一个很好的选择。

2 个答案:

答案 0 :(得分:1)

如果将此作为参数给出,我将使用:

IllegalArgumentException

  

抛出该错误表示方法已传递了非法或不适当的参数

如果这是由应用程序的状态定义的,则:

IllegalStateException

  

Java环境或Java应用程序的状态不适合请求的操作

否则,我认为您的ClassCastException没问题,但是正如所说的那样,那么您无需手动创建它,而是直接进行投射。

答案 1 :(得分:1)

就像伊兰(Eran)所说,如果您只想使用“行业标准” ClassCastException,请尝试强制转换它,不要使用instanceof。如果您想要自定义异常,那么这取决于您的意图。我们需要有关所需内容的更多信息,以便提供更好的示例。我会举一个随机的例子。

例如,如果您打算验证并传递方法参数或因自定义错误消息而失败,我通常会采用以下方法:

public static <T, S extends T> S requireType(Class<S> type, T actual, String varName) {
    requireNonNull(actual, varName);
    if (!type.isInstance(actual))
        throw new IllegalArgumentException('\'' + varName + "' must be of type " +
                                           type.getName() +": " + actual.getClass());
    //noinspection unchecked // It is just checked
    return (S)actual;
}

那些可怕的通用参数是自动处理的,例如:

FirmwarePacket castPacket = requireType(FirmwarePacket.class, packet, "packet");