Java新手试图弄清楚NullPointerException和

时间:2012-04-15 05:33:15

标签: java nullpointerexception

我正在用Java编写iTunes U Stanford CS106a课程并且很喜欢它但是我正在撕毁我对这个名字冲浪者计划的评论。

当我使用此代码时

public NameSurferEntry(String line) {
  int endOfName = line.indexOf(" ");
  name = line.substring(0,endOfName);
  String newLine = line.substring(endOfName+1);
  StringTokenizer tokenizer = new StringTokenizer(newLine);

  if (tokenizer.hasMoreTokens()) {
    name = tokenizer.nextToken();
  }

  for (int i = 0; tokenizer.hasMoreTokens(); i++) {
    array[i] = Integer.parseInt(tokenizer.nextToken());
  }
}

我在第二行(int endOfName等)上看到“NameSurferEntry。(String)line:16”的Suspended / NullPointerException。

如果我尝试这样做:

public NameSurferEntry(String line) {
  StringTokenizer tokenizer = new StringTokenizer(line);
  name = tokenizer.nextToken();

  for (int i = 0; tokenizer.hasMoreTokens(); i++) {
    array[i] = Integer.parseInt(tokenizer.nextToken());
  }
}

我收到一个Suspended / NullPointerException,消息“StringTokenizer。(String,String,boolean)line:182”后跟“Source not found。”

有人对我做错了什么有任何想法吗?

更新

感谢您的帮助。

NameSurferEntry实际上是由另一个为null提供值的类调用的。但是在阅读了你的建议之后,我已经将line声明为ivar,但是在NameSurferEntry的主体中对其进行了初始化,并修复了它。 (在我将line声明并初始化为ivar之前。我不明白为什么我初始化它的地方有所不同,但确实如此。)

下一个错误直到第48行!所以你很快就会再次收到我的消息......在我的路上,看看我是否可以自己解决这个问题。再次感谢。

糟糕

没那么快。

当我将line初始化为NameSurferEntry正文中的实际字符串时,一切正常。

问题是NameSurferEntry是由另一种方法调用的:

public NameSurferDataBase(String filename) {
  try {
    BufferedReader br = new BufferedReader(new FileReader(filename));

    while (true) {
      String blah = br.readLine();

      if (blah == null) {
        break;
      }

      NameSurferEntry entry = new NameSurferEntry(blah);
      hmap.put(entry.getName(), entry);
    }
    br.close();
  }
  catch (IOException ex) {
    throw new ErrorException(ex);           
  }
}

(此方法又由另一种方法调用,为filename提供实际文件,所以我们可以在那里。)

但是如果我将参数blah传递给NameSurferEntry,然后NameSurferEntry然后初始化其参数,那么我就丢失了blah,对吧?我的冲动是将line初始化为方法之外的ivar,然后我再次收到NullPointerException消息,然后我回到我开始的地方。哎呀!

思想?

2 个答案:

答案 0 :(得分:2)

您将构造函数作为参数赋予的line变量为null

如果您致电null构造函数,请确保不输入NameSurferEntry

答案 1 :(得分:1)

您的line参数为空。这就是为什么在尝试NullPointerException时使用line的原因(使用indexOfStringTokenizer上的lineNullPointerException line {{1}} {1}}为空 - 它没有任何操作)。