Java 我如何抓住ClassCastException?

Java 我如何抓住ClassCastException?,java,exception,exception-handling,Java,Exception,Exception Handling,我试图在从xml反序列化对象时捕获ClassCastException 所以 但这不会发生,因为异常不会被捕获。你有什么建议?好吧,我不能使用instanceof操作符,因为该方法是参数化的: public T restore(String from){ ... restoredItem = (T) decoder.readObject(); ... } Java中的泛型只在编译时使用。问题中的代码应该给您一个未经检查的强制转换警告。听-Xlint 编译器只知道T的边界,它可能没有边界(除了显

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

所以


但这不会发生,因为异常不会被捕获。你有什么建议?

好吧,我不能使用
instanceof
操作符,因为该方法是参数化的:

public T restore(String from){
...
restoredItem = (T) decoder.readObject();
...
}

Java中的泛型只在编译时使用。

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

编译器只知道T的边界,它可能没有边界(除了显式扩展对象和null类型的super)。因此,在运行时强制转换实际上是(对象)-不是很有用

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

类MyReader{
私人期末班;
MyReader(课堂教学){
if(clazz==null){
抛出新的NullPointerException();
}
this.clazz=clazz;
}
公共T还原(来自的字符串){
...
试一试{
restoredItem=clazz.cast(decoder.readObject());
...
返回restoredItem;
}捕获(ClassCastException exc){
...
}
}
}
或作为一般方法:

    public <T> T restore(Class<T> clazz, String from) {
        ...
        try {
            restoredItem = clazz.cast(decoder.readObject());
            ...
public T还原(类clazz,字符串from){
...
试一试{
restoredItem=clazz.cast(decoder.readObject());
...

将不会有任何ClassCastException,除非您的T有一些基础:

public class GenericsTest
{
    public static void main(String[] args)
    {
        System.out.println(cast(Integer.valueOf(0)));
        System.out.println(GenericsTest.<Long> cast(Integer.valueOf(0)));
        System.out.println(GenericsTest.<Long> cast("Hallo"));

        System.out.println(castBaseNumber(Integer.valueOf(0)));
        System.out.println(GenericsTest.<Long> castBaseNumber(Integer.valueOf(0)));
        System.out.println(GenericsTest.<Long> castBaseNumber("Hallo"));
    }

    private static <T extends Number> T castBaseNumber(Object o)
    {
        T t = (T)o;
        return t;
    }

    private static <T> T cast(Object o)
    {
        T t = (T)o;
        return t;
    }
}
但这仍然会在以后使用类时导致错误

public Reader<T extends Number>{...}

Long l = new Reader<Long>("file.xml").getValue(); // there might be the ClassCastException
公共阅读器{…}
Long l=new Reader(“file.xml”).getValue();//可能存在ClassCastException

对于这种情况,只有Tom的建议可能会有所帮助。

如果您不能使用instaceof,您可能可以在类上使用isAssignableFrom方法,这难道不意味着对t的转换实际上是由调用方完成的,而不是由方法本身完成的吗?我不太明白您的意思。作为一种快速攻击,我从restore(…)返回一个对象并在更高级别上执行instanceof检查,不涉及泛型(因为它们无论如何都没有帮助)。不过,这很难看。重新标记以使用更常见的异常相关标记。
public class GenericsTest
{
    public static void main(String[] args)
    {
        System.out.println(cast(Integer.valueOf(0)));
        System.out.println(GenericsTest.<Long> cast(Integer.valueOf(0)));
        System.out.println(GenericsTest.<Long> cast("Hallo"));

        System.out.println(castBaseNumber(Integer.valueOf(0)));
        System.out.println(GenericsTest.<Long> castBaseNumber(Integer.valueOf(0)));
        System.out.println(GenericsTest.<Long> castBaseNumber("Hallo"));
    }

    private static <T extends Number> T castBaseNumber(Object o)
    {
        T t = (T)o;
        return t;
    }

    private static <T> T cast(Object o)
    {
        T t = (T)o;
        return t;
    }
}
String s = GenericsTest.<Long> cast("Hallo");
Object o = decoder.readObject();
if (o instanceof Something)
    restoredItem = (T) o;
else 
    // Error handling
public Reader<T extends Number>{...}

Long l = new Reader<Long>("file.xml").getValue(); // there might be the ClassCastException