0

使用此代码,我试图将带有数据的文件加载到对象数组中。我没有正确初始化对象中的字段,因为当我运行此代码时,我得到了 NullPointerException。数组在那里,甚至是正确的大小,但字段没有初始化。我应该如何解决这个问题?

这是代码:

public class aJob {
  public int job;
  {
    job = 0;
  }
  public int dead;
  {
    dead = 0;
  }
  public int profit;
  {
    profit = 0;
  }
}

public class Main {
  public static void main(String[]args) throws IOException {
    File local = readLines();
    Scanner getlength = new Scanner(local);
    int lines = 0; 

    while (getlength.hasNextLine()) {
      String junk = getlength.nextLine();
      lines++;
    }
    getlength.close();

    Scanner jobfile = new Scanner(local);  // check if empty                            

    aJob list[] = new aJob[lines];
    aJob schedule[] = new aJob[lines];
    int index = 0;
    list[index].job = jobfile.nextInt();
  }

  public static File readLines() throws IOException 
  {
    try {
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    } catch (Exception e) {
      // ignore exceptions and continue
    }

    JFileChooser chooser = new JFileChooser();
    try {
      int code = chooser.showOpenDialog(null);
      if (code == JFileChooser.APPROVE_OPTION) {
        return chooser.getSelectedFile(); 
      }
    } catch (Exception f) {
      f.printStackTrace();
      System.out.println("File Error exiting now.");
      System.exit(1);
    }
    System.out.println("No file selected exiting now.");
    System.exit(0);
    return null;
  }
}
4

3 回答 3

5

声明一个数组是不够的。您必须使用对象实例填充它。

aJob list[] = new aJob[lines];
aJob schedule[] = new aJob[lines];

for (int i = 0; i < lines; i++){ list[i] = new aJob(); schedule[i] = new aJob(); }
于 2012-04-29T19:07:13.733 回答
4

问题是数组的元素没有初始化,即仍然为空。

aJob list[] = new aJob[lines]; // creates an array with null values.
for(int i=0;i<lines;i++) list[i] = new aJob(); // creates elements.
于 2012-04-29T19:07:13.187 回答
0

另一种可能性是您可以使用 ArrayList 或 LinkedList 来代替程序中的数组。

例如,

ArrayList<aJob> list = new ArrayList<aJob>(lines);
ArrayList<aJob> schedule = new ArrayList<aJob>(lines);

int index = 0;
list.add(0, new aJob(jobFile.nextInt());

做同样的工作。最后一行使用从扫描仪对象中提取的值创建一个新的 aJob 对象,然后将其插入到位置 0。

虽然数组是一种简单的结构,但使用 List 可以为您提供更大的灵活性,尤其是在您不知道要创建多少 aJob 元素的情况下。数组需要在实例化时定义大小,但 List 具有增长以处理新元素的能力。

于 2012-04-29T19:27:02.490 回答