2010-09-21 108 views
2

我主要是一个C#背景(我非常喜欢新手),所以原谅我,如果我的假设是基于这个问题。在Java中检查异常和File.exists()

简而言之,我正在使用的一个软件(Java)中的一个功能是用户输入一个文件名。我打算做的是让程序循环,并将字符串附加到可能的附加字符串数组的文件名的末尾,以查看文件是否存在,如果存在,请将其打开。我保证只有一个给定名称的文件,所以在第一次成功时突破循环并不是一个错误(如果用户指定的文件名是“foo”,并且appendStrings数组有“bar”和“巴兹“的内部,我保证在目录中永远不会有”foobar“和”foobaz“)。我最终得出的结果与此类似:

public FileReader LocateFile(String fileName) 
{ 
    FileReader toReturn = null; 
    for(int i = 0; i < appendStrings.length; i++) 
    { 
     File locatedFile = new File(fileName + appendStrings[i]); 
     try 
     { 
      toReturn = new FileReader(locatedFile); 
     } 
     catch(FileNotFoundException ex) 
     { 
      continue; 
     } 
    } 
    //...handling in case I didn't find a file. 
} 

太好了,它工作得很好。除了两个问题:

  1. 编译器让我很不满,我声明了一个我没有使用的变量(ex)。我想我可以记录异常或其他东西,但这看起来很荒谬,因为这会经常发生,而且我宁愿不用过多的噪音填充我的日志文件,只是为了让编译器感到高兴。
  2. 我已经从无数来源读到您不使用异常来控制程序的流程;你用它们为例外的情况。

我的问题是:有没有办法在这种情况下取​​悦编译器?我捕捉FileNotFoundException,所以使用File.exists()不会真的解决我的问题。我是在倒退,还是这是Java如何滚动?

+0

您还应该考虑File#exists()返回false,而引发FileNotFoundException的新FileReader(File)不具有相同的语义含义。对于目录,文件#exists()将返回true,对于没有读权限的普通文件,可能会返回true,而在这些情况下,FileReader将引发FileNotFoundException。 – jarnbjo 2010-09-21 16:23:53

回答

0

对于例外情况,第一件事情是正确的,它们应该只在特殊情况下使用。

第二点,你的代码继续;没有必要。如果抛出异常,则继续循环,但如果没有抛出异常会发生什么?
那么,你继续循环。

第三点,编译器不会因为ex变量而不高兴,只有你的IDE告诉你变量没有被使用,不用担心它会发生很多事情。

+0

@SuppressWarning可能有帮助 – 2010-09-21 16:16:51

+0

你是绝对正确的;它是IDE,而不是编译器,它会产生警告。我可以忍受IDE不高兴。 – Sepulchritude 2010-09-21 16:52:39

+0

在IntelliJ中,您可以调用异常“忽略”或“忽略”,或者在catch块中放置注释以说明忽略该异常的原因。这可能也适用于您的IDE。 – 2010-09-21 18:12:00

3

你是对的,你不应该使用异常来控制你的程序流程。

您已经在平面字符串中编写了算法,只是将其转换为Java代码。

public FileReader LocateFile(String fileName) 
{ 
    FileReader toReturn = null; 
    for(int i = 0; i < appendStrings.length; i++) 
    { 
     File locatedFile = new File(fileName + appendStrings[i]); 
     if(locatedFile.exists()) { 
      toReturn = new FileReader(locatedFile); 
      break; 
     } 
    } 
    //...handling in case I didn't find a file. 
} 
+1

是的!如果API提供了一个呼叫来为你做这项工作,你应该使用呼叫! +1 – 2010-09-21 16:16:05

+2

除了......它不会那样工作。你会得到一个未报告的FileNotFoundException编译错误。其次,如果操作系统在locateFile.exists()返回true之后并在“new FileReader()”行执行之前删除文件(或者某人打开它或以其他方式锁定文件),会发生什么情况? – Sepulchritude 2010-09-21 16:49:12

+0

您仍需要捕获创建FileReader时可能引发的FileNotFoundException。 – Grodriguez 2010-09-21 16:52:42

1

我从您不使用异常来控制程序的流程无数源中读取;你在特殊情况下使用它们。

您应该测试该文件是否存在与File.exists()而不是使用例外用于此目的。你是对的,因为在创建FileReader对象时仍然需要捕捉异常,但正如其他人指出的那样,文件可能存在,并且您仍然可能无法使用FileReader来读取它。这两种情况必须分开考虑。

编译器让我很不高兴,我声明了一个我没有使用的变量(ex)。我想我可以记录异常或其他东西,但这看起来很荒谬,因为这会经常发生,而且我宁愿不用过多的噪音填充我的日志文件,只是为了让编译器感到高兴。

确实。但是,如上所述,您应该首先使用File.exists()进行测试,如果该文件似乎存在但您无法创建FileReader,那么是您应该处理的问题。

顺便说一句,我的编译器和我的IDE都没有警告这个未使用的变量。也许你的IDE中有一个设置?

+0

所以处理这种情况的“kosher”方法是继续并首先检查File.exists(也可能是File.IsADirectory和File.CanRead),如果这两者都很好但使用异常,但创建FileReader仍然失败。我大部分都被绊倒在“FileNotFoundException”的语义上,因为我认为它被抛出意味着该文件是......好的,没有找到。 – Sepulchritude 2010-09-21 17:15:02

+0

这就是我处理它的方式,是的。你对'FileNotFoundException'这个有点误导性的名字是正确的;这个异常实际上用于表示几种不同的错误情况,其中一些涉及现有文件,由于各种原因无法打开。 – Grodriguez 2010-09-21 17:31:31

+0

如果它对您有用,您可能想要接受答案(绿色勾号):-) – Grodriguez 2010-09-22 12:38:16