在Catch块中再次重用Try-Catch块

时间:2014-06-25 13:23:19

标签: java

这是我写的代码的和平:

double value;
String fileName;
Scanner readFile;

Scanner reader=new Scanner(System.in);
System.out.println("Enter a file name:");
fileName=reader.next();
reader.close();
try{
    readFile=new Scanner(new FileReader(fileName));
    value=readFile.nextDouble();
    readFile.close();
}
catch(FileNotFoundException e){
    System.err.println("\n The file doen't exist");
}

然后在Catch块中,我想要让用户无限次地询问有效的文件名,直到他输入一个。如果他再次输入无效的文件名,请使用Try-Catch抛出相同的异常。 我该怎么做?谢谢

2 个答案:

答案 0 :(得分:4)

  • 首先,重复使用Scanner(不要立即关闭它 - 但要关闭它 它是时候了)。
  • 然后,使用无限循环(即while (true))无限期地检查用户输入
  • 然后,使用给定的File初始化一个新的String(在循环之前声明它,在循环内初始化它),并检查:
    • 是否存在
    • 您的计划是否具有相应的访问权限(请参阅File API
  • 如果是,请使用break语句退出循环

获得File后,您可以关闭Scanner(或将其重新用于其他内容)。

您可能还想让用户输入"退出"命令退出循环而不继续,以及通知用户文件是否不存在/不可访问。

答案 1 :(得分:2)

您在应用程序中缺少循环概念。

当您的应用程序期望重复某些行为/操作时。你应该将它包含在一个循环中。 forwhile有两个循环可用。

当前面已经知道操作次数并且使用迭代器进行操作时,使用for循环。

当你不知道何时会发生某些动作而你只是等待时,会使用while循环。

boolean shouldRetry = true;

while(shouldRetry) {

     try {
        action(); 
        shouldRetry= false;
      } catch(Exception e) {
        shouldRetry= true;                
      }
}

在您的情况下,需要do while循环,因为您不知道用户何时会提供有效的输入数据。确保操作至少应执行一次。

 boolean shouldRetry= false;

 do {

  try {
    action(); 
    shouldRetry= false;
  } catch(Exception e) {
    shouldRetry= true;                
  }

 }while(shouldRetry)

condition必须是布尔表达式。它决定是否应该采取行动。

编辑:

如果可能,您应该尝试将代码中的操作分开,以分隔方法。

      Scanner reader = new Scanner(System.in);

      do {
          System.out.println("Enter a file name:");
      } while(!processFile(reader.next())); //Read the file name

      reader.close();


   /**
     * @return true if file read with success otherwise false.
     */
    private boolean processFile(String fileName) {

        try {
            //read the file
        }catch(Exception e) {
            return false;
        }
        return true;

    }

这为您提供了更灵活的行为。使用此功能,您可以在文件无效时重试,不仅因为它不存在,而且还可能是因为它没有您期望的值。