“线程中的异常”;“主要”;java.lang.NullPointerException InputStreamReader

“线程中的异常”;“主要”;java.lang.NullPointerException InputStreamReader,java,io,Java,Io,您犯了一个典型的错误,即捕获异常(在本例中为FileNotFoundException),但实际上没有从中恢复。因此,当文件打开失败时,您将把一个null参数传递给InputStreamReader(…),这将导致NPE 另外,我应该将抛出IOException、FileNotFoundException添加到main还是使用try{} Exception in thread "main" java.lang.NullPointerException at java.io.Reader.

您犯了一个典型的错误,即捕获异常(在本例中为FileNotFoundException),但实际上没有从中恢复。因此,当文件打开失败时,您将把一个
null
参数传递给
InputStreamReader(…)
,这将导致NPE

另外,我应该将抛出IOException、FileNotFoundException添加到main还是使用try{}

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);

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

代码可以工作。我自己测试了一下。您输入的文件名不能存在


顺便说一句,由于您已经在使用
扫描仪
读取stdin,因此还应该使用
扫描仪
读取文件。我认为使用
BufferedReaders
有点笨拙。

所以你的问题是出了什么问题和/或应该怎么做?我认为这两个问题的答案都会有帮助。看起来你的文件输入流是空的。您应该将代码的最后两行移到try块中。一般来说,接受异常是个坏主意。当这两行在try块中时,“in”后来就没有定义了。我应该将其更改为抛出FileNotFoundException吗?你能澄清一下“swallow”的意思吗?swallow的意思是捕获异常并忽略它。尽管正在打印堆栈跟踪(总比不打印好),但程序仍会继续执行,而没有修复问题。从程序的角度来看,您忽略了异常,因此吞咽了异常。一般来说,要么修复它,要么让程序终止。也许clunky这个词用错了。我真正的意思是扫描仪比BufferedReader提供更多的实用程序。使用BufferedReader尝试除readLine()之外的任何操作都意味着您必须开始一次执行一个字符的操作。有了扫描器提供的所有实用程序,它更容易使用和执行更多操作。但代码仅在某些条件下仍然有效。文件必须存在于指定位置,且字符串必须正确。如果不是,则抛出、打印异常,代码继续运行而不处理异常。所以代码并没有真正起作用。BufferedReader是它的最小问题。
    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);