【问题标题】:ArrayList.toArray() throws NullPointerExceptionArrayList.toArray() 抛出 NullPointerException
【发布时间】:2012-10-16 14:08:34
【问题描述】:

我在主类中声明了两个 ArrayList。一个是例程对象的 ArrayList,另一个是例程名称的字符串数组。每次构造例程时,该例程名称以及存储在例程中的都存储在 Names 数组列表中。

    static ArrayList <Routine> routineArrayList = new ArrayList <Routine> ();
    static ArrayList <String> Names = new ArrayList <String> ();                    

我创建了一个 JList 并使用 String Names arrayList 来填充它..

    list = new JList(Names.toArray());

一切顺利,我可以选择一个名称并选择相应的例程。

问题是每个例程都有自己的名称数组列表。

我希望能够使用选定的例程并使用该例程内部的名称填充 JList。这就是我正在尝试的..

    currentRoutine = routineArrayList.get(intChoice);
    ...
    list = new JList(currentRoutine.Names.toArray());  ******** PROBLEM LINE

System.out.println(currentRoutine.Names.toArray()) 给出完全相同的NullPointerException

这对我来说已经有一段时间了,如果需要更多信息,我将竭诚为您提供任何帮助。

编辑

感谢您的回答,事实证明,主要问题是每个 Routine 对象内的名称数组未正确初始化。但是,问题仍然存在。

'System.out.println("Choice: " + currentRoutine.names.get(0)); // Or get(x) 

'System.out.println("Choice: " + currentRoutine.names.toString() 

两者都给出了他们应该做的。完整的名称数组或元素 注意:'System.out.println("Choice: " + currentRoutine.names.toArray() 给出地址详细信息等。

但是,当我尝试时

'list = new JList(currentRoutine.names.toArray());' 

我得到相同的 NullPointerException?

干杯

【问题讨论】:

  • 可能是 currentRoutine (or) Names null 吗?
  • NamesroutineArrayList是故意static吗?它真的应该是类变量而不是实例变量吗?
  • 如果每个Routine都有自己的名字列表,那为什么Namesstatic呢?顺便说一句,它应该被命名为names。大写名称通常保留给 Java 中的类型。
  • names 和routineArrayList 是静态的,因为它们都在主类中由静态函数访问。每个例程变量都有一个名称 ArrayList,它是非静态的。

标签: java exception arraylist nullpointerexception


【解决方案1】:

ArrayList&lt;String&gt;.toArray() 方法永远不应该抛出NullPointerException,所以这里的问题几乎可以肯定是currentRoutinecurrentRoutine.Namesnull。您需要检查填充 routineArrayList 的代码,确保其所有元素均非空且具有非空 Names 字段。

【讨论】:

    【解决方案2】:

    建议:遵循字段的命名约定,所以static ArrayList &lt;String&gt; names 而不是static ArrayList &lt;String&gt; Names

    currentRoutinecurrentRoutine.Names 似乎为空,正如 ruakh 在他的回答中提到的那样。

    所以对可空性做一个小的检查。

    【讨论】:

      【解决方案3】:

      感谢你们的帮助,

      我把它整理好了,这确实与布局不佳的 Frames 和 JLists 有关。我最终在我的第一个 JList 的 selectionListener 中声明了一个新的“名称”(Routine.names)JList 以及一个新的 JFrame。

      干杯,

      马修

      【讨论】:

        猜你喜欢
        • 2017-08-11
        • 2013-09-07
        • 2013-06-18
        • 2016-07-07
        • 2014-10-02
        • 2012-05-21
        • 2014-08-15
        • 2013-08-06
        • 2019-09-21
        相关资源
        最近更新 更多