0

我正在修补一个小型应用程序以从文件中读取一些数字。到目前为止一切都运行良好,但现在我遇到了一个我不知道如何有效解决它的问题。如果用户无意中输入了错误的文件名,JVM 将抛出 FileNotFoundException,我在调用方法中捕获了该文件名。现在我想再给他(用户)两次尝试输入正确的文件名,但我不知道如何再次调用打开文件的方法,当我实际上在下面的捕获块中时。我将在下面说明我的临时解决方案,但我不确定这是否是解决此问题的最有效/最优雅的方法:

//code omitted
            int temp = 0;

        while(true) {
            filename = input.next();

            try {
                ex.fileOpen(filename);
            }
            catch(FileNotFoundException e) {
                if(temp++ == 3) {
                    System.err.println("You have entered the filename three times consecutively wrongly");
                    return;
                }
                continue;
            }
            break;
        }
//do some other stuff

input 是一个扫描器,它读取用户输入并将其分配给字符串变量文件名。fileOpen 是一种获取文件名、打开文件、读取内容并将所有数字写入向量的方法。

所以,我非常感谢更有经验的 Java 程序员的每一次支持。

问候汤姆

4

6 回答 6

1

你可以使用这样的东西,

public class AppMain {

  public static void main(String[] args) throws IOException {
    String filePath = input.next();

    InputStream is = getInputStream(filePath);
    int temp = 0;

    while(is == null && temp < 3){
      filePath = input.next();
      is = getInputStream(filePath);
      temp++;
    }

    if(is == null){
      System.err.println("You have entered the filename three times consecutively wrongly");
      return;
    }

    .........
    .........

  }

  private static InputStream getInputStream(String filePath){
    InputStream is = null;

    try{
      is = new FileInputStream(filePath);
      return is;
    }catch (IOException ioException) {
      return null;
    }
  }
}
于 2013-07-17T21:42:21.517 回答
1

您可能希望再次递归调用该方法:

  public void doTheStuff(int attemptsLeft)
      // ...
      if (attemptsLeft == 0) {
         System.err.println("You have entered the filename three times consecutively wrongly");
         return;
      }
      filename = input.next();
      try {
          ex.fileOpen(filename);
      }
      catch(FileNotFoundException e) {
          doTheStuff(attemptsLeft - 1);
          return;
      }
      // ...
  }

然后只需调用doTheStuff(3)

于 2013-07-17T21:45:56.267 回答
0

像这样的东西怎么样(伪代码,不可执行)?

// ...
    for(int i = 0; i < 3; i++)
    {
        // User interaction to get the filename

        if(attemptToOpenFile(ex))
        {
            break;
        }
    }
    // Check if the file is open here and handle appropriately.
// ...
}

bool attemptToOpenFile(File ex, String filename) { // Forgot the class name for this
    try {
        ex.fileOpen(filename);
        return true;
    } catch(FileNotFoundException e) {
        return false;
    }
}

或者,在调用 fileOpen() 之前检查文件是否存在。

于 2013-07-17T21:52:33.443 回答
0

你可以使用类exists的方法File

例如fileOpen方法可以返回真/假文件是否存在

于 2013-07-17T21:30:01.780 回答
0

认为这会奏效。

    int x = 0;
    while (true){
       filename = input.next();

       try{
          ex.fileOpen(filename);
          break;  // If it throws an exeption, will miss the break
       }catch(FileNotFoundException e){
          System.err.println("File not found, try again.");  
       }
       if (x==2){
          System.errprintln("You have entered the wrong file 3 times");
          System.exit(0);
       }
       x++
    }
于 2013-07-17T21:39:56.237 回答
0

不要使用异常来控制您的工作流程。尝试这样的事情:

 final int MAX_ERROR_ALLOWED=3;
public void readFile(String filename, int errorCount){
     try{
       File f = new File(filename);
       if(!f.exists()){
          String newFilename = input.next();
          if(errorCount>=MAX_ERROR_ALLOWED){
              throw new JustMyException();
          }
          readFile(newFilename, errorCount++);   
       }else{
           //whatever you need to do with your file
       }
     }
}
于 2013-07-17T21:57:29.557 回答