2015-01-05 1 views
3

У меня возникло исключение при использовании StringReader. Строка, которую я анализирую при создании объекта, создавалась через String.split, она дает мне NullPointerException. Любое предложение, как это исправить?StringReader дает ошибку из String.Split output

Вот код:

public static void main(String[] args) throws IOException { 
    // TODO code application logic here 
    int jmldoc = 5; 
    Hashmap hashsentences[][] = new Hashmap[5][100]; 
    Docreader reader = new Docreader(); 
    System.out.println(reader.doc[1]); 

    for (int i = 0; i < jmldoc; i++) { 
     int j = 0; 
     while (reader.sentences[i][j] != null) { 
      System.out.println(reader.sentences[i][j]); 
      j++;    
      String temp=reader.sentences[i][j]; 
      StringReader h = new StringReader(temp); 

     } 
    } 


} 

и класс docreader

public class Docreader { 

    public String sentences[][]=new String[5][100]; 
    public String doc[]=new String[5]; 

    public Docreader() throws IOException{ 

    this.readdoc(); 
    this.splittosentence(); 

    } 

    public void readdoc() throws IOException { 
     for (int i = 0; i < 5; i++) { 
      String temp = new String(); 
      temp = Docreader.readFile("datatrain/doc" + (i + 1) + ".txt"); 
      this.doc[i] = temp; 
     } 

    } 

    public void splittosentence() { 


     for (int i = 0; i < 5; i++) { 
      String temp[]; 
      temp = doc[i].split("\\."); 
      for(int j=0;j<temp.length;j++){ 
      sentences[i][j]=temp[j]; 

      } 

     } 

    } 

    private static String readFile(String fileName) throws IOException { 
     try (BufferedReader br = new BufferedReader(new FileReader(fileName))) { 
      StringBuilder sb = new StringBuilder(); 
      String line = br.readLine(); 

      while (line != null) { 
       sb.append(line); 
       sb.append("\n"); 
       line = br.readLine(); 
      } 
      return sb.toString(); 
     } 
    } 
} 

Исключение:

Exception in thread "main" java.lang.NullPointerException 
at java.io.StringReader.<init>(StringReader.java:50) 
at stki_d_8_final.STKI_D_8_Final.main(STKI_D_8_Final.java:45) 

Java Результат: 1

И когда я проверил линию 50 в StringReader класса он содержит

this.length = s.length(); 
+0

Опубликуйте свое исключение с полной трассировкой стека. –

+0

@ PM77-1 Я не знаю, как это сделать –

+0

Да, вы знаете, поскольку уже сделали это. –

ответ

4

В этой части кода:

while (reader.sentences[i][j] != null) { 
    System.out.println(reader.sentences[i][j]); 
    j++;    
    String temp=reader.sentences[i][j]; 
    StringReader h = new StringReader(temp); 
} 

Вы с помощью j++ поэтому значение j увеличивается на 1, то есть этот код:

String temp=reader.sentences[i][j]; 

Поскольку эта новая запись в массиве не была оценена, если она отличается от null, она может содержать значение null, которое является ассиметричным gned до temp и, таким образом, инициализируют значение StringReader с параметром null.

Способ его решения будет увеличиваться j после использования его для построения StringReader. Кроме того, в его текущей форме этот код также может выдавать ArrayIndexOutOfBoundsException, если все значения для reader.sentences[i] не являются null. Это было бы решением для кода выше:

while (j < reader.sentences[i].length && reader.sentences[i][j] != null) { 
    System.out.println(reader.sentences[i][j]); 
    String temp=reader.sentences[i][j]; 
    StringReader h = new StringReader(temp); 
    j++; 
} 
+0

спасибо, что это работает, ха-ха-час. –

+2

Я бы сказал, стартер, а не нуб. Пожалуйста. –

+0

проголосовать за вверх для лучшего объяснения –

3

В этой части кода:

while (reader.sentences[i][j] != null) { 
     System.out.println(reader.sentences[i][j]); 
     j++;    
     String temp=reader.sentences[i][j]; 
     StringReader h = new StringReader(temp); 
} 

вы надлежащим образом убедиться, что reader.sentences[i][j] != null, однако вы затем увеличить J (j++) и сделать не выполните нулевую проверку.

+0

спасибо: D, извините noob time. –