2012-12-03 39 views
1

我觉得它更容易只显示代码,我变得比去解释它:)在Java中,为什么在尝试显示FileNotFoundException时收到NullPointerException?

这是我的主要方法的输出:

//prompt user for filename 
    System.out.println("Please enter the text file name. (Example: file.txt):"); 
    String filename = ""; //will be used to hold filename 

    //loop until user enters valid file name 
    valid = false; 
    while(!valid) 
    { 
     filename = in.next(); 
     try 
     { 
      reader.checkIfValid(filename); 
      valid = true; //file exists and contains text 
     } 
     catch (Exception e) 
     { 
      System.out.println(e + "\nPlease try again."); 
     } 
    } 

这是reader.checkIfValid方法:

public void checkIfValid(String filename) throws InvalidFileException, FileNotFoundException 
{ 
    try 
    { 
     in = new Scanner(new File(filename)); 

     if (!in.hasNextLine()) // can't read first line 
      throw new InvalidFileException("File contains no readable text."); 
    } 
    finally 
    { 
     in.close(); 
    } 
} 

这是输出当输入一个不存在的文件,我得到:

请输入文本文件名。 (例如:file.txt的):

doesNotExist.txt

显示java.lang.NullPointerException

请重试。

为什么System.out.println(e)得到NullPointerException?当我输入一个空文件或文本文件时,它工作得很好。空文件打印InvalidFileException(自定义异常)消息。

当我把一个try-catch语句围绕“在=新的扫描仪(新文件(文件名));”,并有catch块显示异常,我得到FileNotFoundException异常打印出来,其次通过 NullPointerException(我不完全确定为什么如果在checkIfValid方法中已经捕获异常,主方法中的catch块将被激活...)。

我在这上面花了一段时间,对于什么是错的,我完全无能为力。任何帮助,将不胜感激。谢谢!

+1

我认为,* reader *为空。 – adatapost

+0

可以请你发布错误stacktrace –

+0

@sheldonCooper,我没有看到一个堆栈跟踪?我在哪里可以找到它?此外,我初始化阅读器,它只会导致这个空的异常,当文件是坏*。 – yts

回答

3

已编辑:我认为空指针来自读者的调用,捕获所有异常是一种糟糕的做法,因为您不再知道它们来自哪里!

也许checkIfValid方法应该检查文件名是否有效?

public boolean checkIfValid(String filename) { 
    try { 
     File file = new File(filename); 
     return file.exists(); 
    } catch (FileNotFoundException) { 
     System.out.println("Invalid filename ["+filename+"] "+e); 
    } 
} 

然后调用它的代码可能看起来像;

filename = in.next(); 
valid = reader.checkIfValid(filename); 
if (valid) 
    List<String> fileContents = readFromFile(filename); 

然后在它自己的方法中包含所有的文件读取逻辑,

public List<String> readFromFile(filename) { 
    List<String> fileContents = new ArrayList<String>(); 
    try { 
     in = new Scanner(new File(filename)); 
     while (in.hasNextLine()) { 
      fileContents.add(in.nextLine); 
     } 
    } catch (IOException e){ 
     //do something with the exception 
    } finally { 
     in.close(); 
    } 
    return fileContents;   
} 
+0

感谢您的回复。为什么新文件调用会导致空指针异常?为什么当我用try catch块包围新文件语句时,我得到了FileNotFoundException?这并不表明新文件正在抛出正确的异常吗? – yts

+0

我是新来捕捉异常,所以谢谢你的建议。我只是不喜欢让代码充满尝试捕获的想法。这是什么代码*应该看起来像? – yts

+0

这个想法是,你可以捕捉到最具体的例外,所以你可以快速找到问题所在。在处理文件交互时,需要大量的try/catch块来实现这一点。我见过的最好质量的代码有一些catch块来支持这个:) – case

-1

我的错误是我只能看到的东西。我赶上了所有的例外,所以我无法看到它是从哪里来的。感谢您的帮助!

相关问题