java - 我如何捕获 ClassCastException?

标签 java exception exception-handling

从 xml 反序列化对象时,我试图捕获 ClassCastException。

所以,

try {
    restoredItem = (T) decoder.readObject();
} catch (ClassCastException e){
    //don't need to crash at this point,
   //just let the user know that a wrong file has been passed.
}

但这不会,因为没有捕获到异常。你有什么建议?

最佳答案

问题中的代码应该给你一个未经检查的强制转换警告。听 -Xlint。

编译器对 T 的所有了解就是它的边界,它可能没有边界(除了显式扩展 Object 和 null 类型的父类(super class))。因此,运行时的转换实际上是 (Object) - 不是很有用。

您可以做的是传入参数化类型的类实例(假设它不是通用的)。

class MyReader<T> {
    private final Class<T> clazz;
    MyReader(Class<T> clazz) {
        if (clazz == null) {
            throw new NullPointerException();
        }
        this.clazz = clazz;
    }
    public T restore(String from) {
        ...
        try {
            restoredItem = clazz.cast(decoder.readObject());
            ...
            return restoredItem;
        } catch (ClassCastException exc) {
            ...
        }
    }
}

或者作为通用方法:

    public <T> T restore(Class<T> clazz, String from) {
        ...
        try {
            restoredItem = clazz.cast(decoder.readObject());
            ...

关于java - 我如何捕获 ClassCastException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/186917/

相关文章:

java - Spring Boot 的时区

java - 如何使用 Java 按类名解析 XML 文档

java - Lagom lagomServiceLocatorStart 不工作 - 连接被拒绝

php - Facebook PHP SDK 3.0 - OAuthException : An active access token must be used to query information about the current user

java - Spring @Transactional 方法错误处理

ios - EXC_BAD_ACCESS 自动处理

java - 了解hibernate中的多对多映射

exception - Tomcat ServeletException NoClassDefFoundError 异常

C# 捕获 ThreadPool 上发生的异常

php - 如何使用 PHPUnit 测试确切的异常消息,而不是子字符串?