我主要是一个C#背景(并且非常新手),如果基于此的假设是问题,请原谅我。
简单地说,我正在处理的一个软件中的一个功能(在Java中)让用户输入一个文件名。我打算做的是让程序循环并从可能的追加字符串数组中追加一个字符串到文件名的末尾,以查看文件是否存在,如果存在,则打开它。我保证只有一个给定名称的文件,因此在第一次成功时突破循环不是错误(如果用户指定的文件名为“foo”且appendStrings数组具有“bar”和“ baz“在其中,我保证在目录中永远不会有”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.
}
很好,它运作得很好。除了两个问题:
我的问题是:在这种情况下有没有办法取悦编译器?我有来捕获FileNotFoundException,因此使用File.exists()不会真正解决我的问题。我是在倒退,还是这就是Java滚动的方式?
答案 0 :(得分:4)
你是对的,你不应该使用例外来控制你的程序流程。
您已经在平面字符串中编写了算法,只需将其转换为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 :(得分:1)
我从无数来源读到你不使用例外来控制程序的流程;你在特殊情况下使用它们。
您应该测试文件是否与File.exists()
一起存在,而不是为此目的使用例外。你是对的,你仍然需要在创建FileReader
对象时捕获异常,但是正如其他人所指出的,文件可能存在,你仍然可能无法用{{1}读取它}。这两种情况必须分开考虑。
编译器对我感到不安,我正在声明一个我不使用的变量(ex)。我想我可以记录异常或其他内容,但这看起来很荒谬,因为这种情况经常发生,我宁愿不用过多的噪音填充我的日志文件,只是为了让编译器满意。
事实上。但是,如上所述,您应首先使用FileReader
进行测试,如果文件似乎存在但您无法创建File.exists()
,那么 是您应该处理的问题。< / p>
顺便说一下,我的编译器和IDE都没有警告这个未使用的变量。也许你的IDE中有一个设置?
答案 2 :(得分:0)
首先你对异常是对的,它们应该仅用于特殊情况。
第二点,你的代码继续;没有必要。如果抛出异常,那么你继续循环,但是如果没有抛出异常会发生什么? 好吧,你继续循环。
第三点,编译器不会因为ex变量而烦恼,只有你的IDE告诉你这个变量没有被使用,不用担心它会发生很多。