2012-03-01 55 views
0
Exception in thread "main" java.lang.NullPointerException 
    at java.io.Reader.<init>(Unknown Source) 
    at java.io.InputStreamReader.<init>(Unknown Source) 
//at InputStreamReader inStream = new InputStreamReader(fis); 
Exception in thread "main" java.lang.NullPointerException 
    at java.io.Reader.<init>(Unknown Source) 
    at java.io.InputStreamReader.<init>(Unknown Source) 
//at InputStreamReader inStream = new InputStreamReader(fis); 

此外,我应该添加抛出IOException,FileNotFoundException主或使用尝试{},而不是?异常在线程“主”java.lang.NullPointerException InputStreamReader

System.out.print("Enter the filename: "); 

    Scanner stdin = new Scanner(System.in); //Keyboard input 
    String fileName=stdin.nextLine(); 

    FileInputStream fis = null; 
    try { 
     fis = new FileInputStream(fileName); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 
    InputStreamReader inStream = new InputStreamReader(fis); 
    BufferedReader in = new BufferedReader(inStream); 
+0

所以你的问题是出了什么问题和/或你应该怎么做? – nmagerko 2012-03-01 03:21:33

+0

我认为这两个答案都会有所帮助。 – user93200 2012-03-01 03:24:04

+1

看起来像您的文件输入流为空。您应该将代码的底部两行移入try块。作为一般惯例,吞并异常是一个糟糕的主意。 – Perception 2012-03-01 03:25:47

回答

5

你让捕捉异常(在这种情况下FileNotFoundException异常),并没有真正从中恢复的经典错误。因此,当文件打开失败时,您然后将null参数传递给InputStreamReader(...),这导致NPE。

此外,我应该添加抛出IOException,FileNotFoundException主或使用尝试{},而不是?

这取决于您的要求。您必须决定是否要让例外传播到main(可能不得不放弃),还是希望当前的方法尝试恢复。例如,你可以要求一个不同的文件名...

-3

该代码有效。我自己测试了一下。您输入的文件名不得存在。顺便提一下,既然您已经在使用Scanner来读取标准输入,您还应该使用Scanner来读取您的文件。我认为BufferedReaders有点笨重。

+0

笨重是什么意思?他们为什么笨重? – 2012-03-01 04:34:15

+0

也许笨重是使用错误的词。我真正的意思是扫描仪提供比BufferedReaders更多的工具。使用BufferedReader尝试除readLine()以外的任何其他方法意味着您必须一次开始处理一个字符。通过Scanner提供的所有实用程序,使用起来更轻松,而且做得更多。 – 2012-03-01 04:43:30

+1

但是代码在某些情况下仍然有效。该文件必须存在于指定的位置,并且该字符串必须正确。如果没有,则抛出,打印异常,代码继续运行而不处理异常。所以代码并不真正起作用。 BufferedReader是其中最少的问题。 – 2012-03-01 04:53:12

相关问题