【问题标题】:Casting inner objects in java - unchecked exception在java中转换内部对象 - 未经检查的异常
【发布时间】:2011-01-30 17:42:51
【问题描述】:

我遇到了内部类的问题。我构建了一个对象(比如火车),其内部类表示状态(比如火车的停靠点)。

我正在尝试运行此代码:

private void CustomObjectBuilder (String [] origin) {

  final int array_dim = origin.length;

  InnerCustomObject[] tmp_bin = new InnerCustomObject[array_dim];

  for (int ii = 0; ii < array_dim; ii++) {

   String debug = extractData(origin[ii]);


   tmp_bin[ii].setData(debug);



  }




 }

它编译得很好,但在运行时我得到一个空对象异常。

我做错了什么?

这里可以找到原代码:

public class CustomObject {



    InnerCustomObject [] stops;

    public class InnerCustomObject {

        String name, station, schedTime, depTime, schedRail, depRail;

        public void setData (String origin) {

            this.station = origin;
        }

    }
}

编辑:我通过调用解决了

 CustomObject.InnerCustomObject ico = new CustomObject(). new InnerCustomObject(); 

为什么需要如此冗长?

【问题讨论】:

    标签: java arrays inner-classes


    【解决方案1】:

    嗯,我注意到的最直接的事情是,在声明 tmp_bin[] 之后,您没有使用任何对象填充它。当你第一次创建一个数组时,它包含的都是nulls。

    因此,当您在循环中执行此操作时:

    tmp_bin[ii].setData(debug);
    

    没有什么可以调用setData(),导致异常。

    重新编辑:你可以这样做

    InnerCustomObject ico = this.new InnerCustomObject();
    

    因为您是在外部 CustomObject 类的 CustomObjectBuilder() 实例方法中创建它们。

    【讨论】:

    • 我是这么想的,但是如果我添加 tmp_bin[ii] = new InnerCustomObject();它没有编译...我该如何解决这个问题?
    • 您必须显示更多代码。你的InnerCustomObject 班级是什么样的?编译器给出什么错误?
    • 当我尝试访问数组的第一个元素时出现空指针异常...
    • 但是 NullPointerExceptions 是运行时错误,而不是编译时错误。我问的是当您尝试使用tmp_bin[ii] = new InnerCustomObject(); 编译时编译器会给出什么错误,但它失败了。
    • Eclipse 没有显示任何内容,只是一个没有信息的红色 X。我通过做 CustomObject.InnerCustomObject ico = new CustomObject() 解决了。新的内部自定义对象(); ....为什么需要这么冗长?
    【解决方案2】:
    InnerCustomObject[] tmp_bin = new InnerCustomObject[array_dim];
    

    声明一个 array_dim 元素数组,但全部为空。那么这个

    tmp_bin[ii].setData(debug);
    

    不会工作。

    内部类没有问题,只有对象为 null (=NPE),因此您不能调用方法 setData()。

    【讨论】:

      【解决方案3】:

      在您的循环中,您必须创建 InnerCustomObject 的新实例。通过 new InnerCustomObject[size] 您不会创建新实例。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-03
        • 2015-02-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-24
        • 1970-01-01
        相关资源
        最近更新 更多