NullPointerExcetion Нативный метод Accessor ... Проблема с хэшированием - PullRequest
0 голосов
/ 27 октября 2011

Я пишу проект, который читает файл и сортирует «Слова». Этот код компилируется правильно, но затем он дает мне исключение нулевого указателя. Есть идеи?

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
import java.util.Hashtable;

public class Lab {
   Hashtable<String, Word> words = new Hashtable<String, Word>();

   public void addWord(String s, int i) {
      if (words.containsKey(s)) {
         words.get(s).addOne();
         words.get(s).addLine(i);
      } else {
         words.put(s, new Word(s));
         words.get(s).addLine(i);
      }
   }

   public void main(String[] args) {
      System.out.println("HI");
      File file = new File("s.txt");
      int linecount = 1;
      try {
         Scanner scanner = new Scanner(file);
         System.out.println("HUH");

         while (scanner.hasNextLine()) {
            String line = scanner.nextLine();
            while (line != null) {
               String word = scanner.next();
               addWord(word, linecount);
            }
            linecount++;

         }
      } catch (FileNotFoundException e) {
         e.printStackTrace();
      }
   }
}

Трассировка стека исключения:

java.lang.NullPointerException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:27‌​1)

Ответы [ 3 ]

3 голосов
/ 27 октября 2011

Эта while петля странная:

while (scanner.hasNextLine()) {
    String line = scanner.nextLine();
    while (line != null) {
       String word = scanner.next();
       addWord(word, linecount);
    }
    linecount++;
}

Если ваш входной файл:

a
b

Тогда scanner.nextLine() будет возвращено a, тогда scanner.next() вернет b, потому что nextLine возвращает следующую строку с разделителями в конце строки, а next возвращает следующий токен из входного файла. Это действительно то, что вы хотите? Я бы предложил попробовать это:

while (scanner.hasNextLine()) {{
    String word = scanner.nextLine();
    addWord(word, linecount);

    linecount++;
}

Имейте в виду, что это будет работать, только если в строке будет только слово. Если вы хотите обрабатывать несколько слов в строке, это будет немного длиннее:

while (scanner.hasNextLine()) {{
    String line = scanner.nextLine();

    Scanner lineScanner = new Scanner(line);
    while(lineScanner.hasNext()) {
        addWord(lineScanner.next(), linecount);
    }

    linecount++;
}
3 голосов
/ 28 октября 2011

Здесь есть две разные проблемы: 1. Ваш основной метод не является статичным. 2. DrJava, IDE, которую вы используете, не показывает хорошее сообщение об ошибке.

Что касается задачи 1, если вы добавите static к объявлению слов, addWord и main, вы сможете запустить вашу программу.

Плохое сообщение об ошибке, проблема 2, является результатом ошибки в команде DrJava "run", которая должна запускать как программы Java, так и апплеты Java. Что касается 2., я подал отчет об ошибке на странице SourceForge DrJava. Мы скоро исправим эту ошибку.

Прошу прощения за неудобства.

2 голосов
/ 27 октября 2011

Вы разместили это в комментарии:

java.lang.NullPointerException
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
 at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
 at java.lang.reflect.Method.invoke(Unknown Source) 
 <i>at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:27‌​1)</i>

Похоже, вы используете нестандартный компилятор Java.Попробуйте скомпилировать это с помощью javac от Sun или IBM, чтобы увидеть, дает ли он другой след.Если это так, то это может быть просто ошибкой в ​​реализации javac в вашем университете.

Я упоминаю об этом, поскольку использование класса JavacCompiler является подозрительным для выполнения вашего кода во время выполнения.

...