【问题标题】:Java class casting throws exceptionJava 类转换抛出异常
【发布时间】:2013-08-28 21:59:14
【问题描述】:

我有一个超类 A,以及扩展 A 的 B、C 和 D 类。

class A {}
class B extends A {}
class C extends A {}
class D extends A {}

然后我有一个这样的列表:

[B.class, C.class, D.class]

我从列表中随机抽取一个项目并像这样实例化它:

Object obj = list.get(i).newInstance()

现在我需要将 obj 传递给一个接受 A 类型对象作为参数的方法。

A a = (A) obj 

导致java抛出异常(InstantiationException或IllegalAccessException,我不知道,因为android studio不会在catch内的断点处停止,并且任何从catch中保存异常信息的尝试都会导致null.. .).

我明白为什么我不能动态指定新对象类型然后将 obj 转换为该类型,但如果它们都共享共同的父对象,我不明白为什么它不起作用。

谁能告诉我如何解决我目前正在做的事情,或者以类似的方式实现同​​样的事情?

谢谢! /最大

【问题讨论】:

  • 你能展示你的方法,你是如何调用它的,以及完整的堆栈跟踪吗?
  • 'InstantiationException 还是 IllegalAccessException,我不知道',你希望我们怎么知道?
  • 能否请您也显示 newInstance() 方法的代码?
  • @Ankit 这是来自 Java Class 对象的方法:docs.oracle.com/javase/7/docs/api/java/lang/…
  • @jbx..谢谢!

标签: java android class casting


【解决方案1】:

newInstance 方法可以抛出 InstantiationException 或 IllegalAccessException,因此如果此调用未包含在 try/catch 中,您可能会在 IDE 中看到警告。不过,您的简单示例似乎可以正常工作。

class A {}
class B extends A {}
class C extends A {}

public class Test {
    public static void main(String[] args) throws Exception {
        List<Class> list = new LinkedList<Class>();
        list.add(B.class);
        list.add(C.class);

        Object obj = list.get(0).newInstance();

        A a = (A) obj;

        System.out.println(a instanceof B);

    }
}

打印“真”

【讨论】:

  • 谢谢,实际上是 android studio 的问题导致了我的问题。我原以为这是对我的误解,这意味着我试图做一些不受支持的事情。我试过你的示例代码,它当然工作得很好。感谢您抽出宝贵时间提供帮助
【解决方案2】:

最后,这是由于 android studio 的一个错误。重写代码解决了这个问题,我无法重现这个问题

未来搜索者可能会发现有用的其他症状:

  • android studio 不会在 catch 块内的断点处停止
  • 任何尝试在 catch 中保存有关异常的信息都会导致 null(参见下面的示例)

Exception ex = null;
try {
    // do something that raises an exception
    ex = new Exception();
} catch (Exception ex)  {
    ex = ex;
}
// ex == null

正如其他答案所指出的,我在问题中描述的内容通常不会引发异常。

【讨论】:

    【解决方案3】:

    代码似乎运行良好。我不明白你的问题。

        package testplayground;
    
        import java.util.ArrayList;
        import java.util.List;
    
       class A {
    
        void print() {
            System.out.println("inside A");
        }
        }
    
       class B extends A {
    
            public void print() {
                System.out.println("inside B");
            }
        }
    
        class C extends A {
    
        public void print() {
            System.out.println("inside C");
        }
        }
    
        class D extends A {
    
        public void print() {
            System.out.println("inside D");
        }
    }
    
    public class TestPlayGround {
    
        public static void main(String[] args) {
            try {
                List<Class> list = new ArrayList<Class>();
                list.add(B.class);
                list.add(C.class);
                list.add(D.class);
                for (Class classObj : list) {
                    Object obj = classObj.newInstance();
                    A a = (A) obj;
                    methodA(a);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        private static void methodA(A a) {
            a.print();
        }
    }
    

    输出:-

    B 内

    在C里面

    D内

    【讨论】:

      猜你喜欢
      • 2019-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-07
      • 2023-04-09
      • 2011-01-28
      相关资源
      最近更新 更多