2012-10-18 77 views
0

运行我的Java程序时遇到java.lang.NullPointerException错误,读完后我想我明白错误的含义,但我仍然不确定如何解决它。从文件读取时出现NullPointerException

import java.util.ArrayList; 
import java.io.FileInputStream; 
import java.io.DataInputStream; 
import java.io.BufferedReader; 
import java.io.FileOutputStream; 
import java.io.InputStreamReader; 
import java.io.IOException; 
import java.io.PrintStream; 
public class readFile { 


public static ArrayList<String> pullFirst(String fileName) throws IOException{ 
    String filen = "C:\\Users\\Steven\\Desktop\\Tests\\wunderground\\outputTweetsWeather.txt"; 
    ArrayList<String> arl = new ArrayList<String>(); // java 6 ArrayList 

    FileInputStream fs = new FileInputStream(filen); // this is how you access a file in java 
    DataInputStream din = new DataInputStream(fs); 
    BufferedReader bin = new BufferedReader(new InputStreamReader(din)); 

    String line;  
    while(!(line = bin.readLine()).startsWith("String index out of range")){ // read each line in the file while they exist 
     arl.add(line);    // add them to the array list 
    } 

    return arl;         // return the array list 
} 

public static void main(String[] args, int j) { 

    // this is just demo code to prove it works so you can check the output. 
    try{ 
    ArrayList<String> rVal = pullFirst("testFile.txt"); 
     for(String a : rVal){ 
      //System.out.println(a + "\n"); // insert write to file code here 
      if(a.startsWith("+t")){ 
     //   System.out.println(a); 
      } 
     } 
     int i = 36; 


     PrintStream out5 = new PrintStream(new FileOutputStream("forpopUp1.txt", true)); 

     System.setOut(out5); 
    System.out.println(rVal.get(2 + j*i)); // Display Value 


    }catch(Exception e){ 
     System.out.print("Problem in readFile" + e); 
    } 

} 
} 

现在,我不知道这是否是一个事实,即我的主线是

public static void main(String[] args, int j) { 

但是,据我所知我必须这样说,因为做这个类是被跑从另一个类的if条件之后执行,使用线路

readFile.main(args, counterForreadFile); 

这是堆栈跟踪的结果:

java.lang.NullPointerException 
at readFile.pullFirst(readFile.java:22) 
at readFile.main(readFile.java:33) 

任何帮助,将不胜感激!

+1

请添加完整的堆栈跟踪 – amit

+0

我怀疑问题是当文件结束时,''BufferedReader'返回'null'时,并且'while'循环中的条件调用'''字符串“,然后会导致NPE。我不能确定,直到你提供堆栈跟踪 – amit

+0

如何获得堆栈跟踪? – Steve

回答

2

我相信当你读文件被耗尽的错误是:

读取文件:

while(!(line = bin.readLine()).startsWith("String index out of range")){ 
    ... 
} 

当文件被耗尽BufferedReader将返回null

当你做(line=bin.readLine()).startsWith(..)你实际上试图在这种情况下调用startsWith()null - 因此错误。

为了解决这个问题,你应该重复:

while ((line = bin.readLine()) != null) { 
    if (line.startsWith("String index out of range")) break; 
    //rest of the code 
} 

此为您提供安全null当读者被耗尽。

虽然它是一个问题 - 我不能确定它是你遇到的确切问题,直到你提供一个完整的堆栈跟踪。


P.S.正如我已经评论说 - 让堆栈跟踪(提供关于该问题的更多信息),您可以添加到您的catch块,所以这将是类似的东西:

}catch(Exception e){ 
    System.out.print("Problem in readFile" + e); 
    e.printStackTrace(); 
} 

另一种方法是申报main()throws Exception,并删除catch块(和try块)。

+0

Would having while(( lines = bin.readLine())。startsWith(“String index out of range”)!= null){ 好吗?不确定是否有意删除该部分或不是? – Steve

+0

@Steve:不,它会在我描述的情况下导致NPE。您应该首先检查null,并且仅当它不为null时调用新方法。我删除的条件可以在循环内完成。请参阅编辑。 – amit

+0

@Steve no,它不会改为尝试:“while((line = bin.readLine())!= null && line.startsWith(”String index out of range“)){...”右边如果左侧不正确,&&将不会被评估,因此您应该安全。 –

0

在catch(Execption e)通过

e.printStackTrace(); 

:你这行错误更换

System.out.print("Problem in readFile" + e);