【问题标题】:Simple OOP/private variable query- Java简单的 OOP/私有变量查询 - Java
【发布时间】:2013-05-30 02:23:27
【问题描述】:

不太清楚为什么这不起作用,当我尝试编译和运行时,它给了我一个空指针异常。我知道这非常简单,而且可能是一个愚蠢的问题,但我似乎无法弄清楚!

import javax.swing.JOptionPane;

public class Whatever
{

    private int age; 
    private String name;
    private float salary;

    public Whatever ()
    {
        String userName = JOptionPane.showInputDialog ("What is your name?");
        Whatever listData[] = new Whatever [10];
        listData[6].name = userName; 
    }

    public static void main (String [] args)
    {
        Whatever testWhatever = new Whatever ();
    }
}

【问题讨论】:

    标签: java arrays variables object private


    【解决方案1】:

    有了这个

    Whatever listData[] = new Whatever [10];

    你初始化了一个新的 Array,但是 Array 中的元素没有被初始化。

    所以当你访问listData[6].name 时你会得到一个 NullPointerException。

    你可以试试这个:

    for(int i = 0; i < listData.length; i++) {
        listData[i] = new Whatever(); 
    }
    

    ,但请不要在构造函数本身中执行此操作。 因为那样你就会像 duffymo 说的那样得到 OutOfMemoryException。

    例如,尝试直接在 main 中执行此操作。

    【讨论】:

      【解决方案2】:

      Whatever 实例数组 - 都是 null

      我猜你一修复OutOfMemoryError 就会遇到另一个问题,因为当你调用 new 来初始化 Whatever 数组元素时,它们会构造自己的数组并调用 new,等等直到出现 OOM 错误。

      我会为你拼写出来,这样你就可以看到下一个错误:

      import javax.swing.JOptionPane;
      
      public class Whatever
      {
          private int age; 
          private String name;
          private float salary;
      
          public Whatever () {
              String userName = JOptionPane.showInputDialog ("What is your name?");
              Whatever listData[] = new Whatever[10];
              for (int i = 0; i < listData.length; ++i) {
                  listData[i] = new Whatever();  // This is where you'll get the OOM error.  See why?
              }
              // You'll never get here.
              listData[6].name = userName; 
          }
      
          public static void main (String [] args)
          {
              Whatever testWhatever = new Whatever();
          }
      }
      

      并且您将 Swing 代码放入构造函数中?您是否打算以此作为编写不良代码的示例?

      仅供将来参考,您应该在一个良好的 IDE(例如市场上最好的 IntelliJ)中运行您的代码,并打开调试并逐步执行代码。您会很快找出问题所在,比在 SO 上询问会告诉您的速度更快。

      所以是的,这是一个非常愚蠢的例子。希望你写的不是真的这样的东西。

      【讨论】:

      • 我是非常非常初学者哈哈,我想做的是为Whatever类的数组元素的“名称”字段赋值,但显然我是什么上面做的不行
      • 我明白你在做什么。你明白我的回答吗?你知道这会给你带来什么麻烦吗?
      • 啊,是的,我现在看到了错误!非常感谢
      猜你喜欢
      • 2015-06-05
      • 2016-11-05
      • 1970-01-01
      • 1970-01-01
      • 2012-09-03
      • 2022-01-14
      • 2012-08-02
      • 2011-11-17
      • 2012-07-26
      相关资源
      最近更新 更多