【问题标题】:Catching exception and requesting user to re-enter input捕获异常并请求用户重新输入
【发布时间】:2018-04-18 15:58:21
【问题描述】:

我正在创建一个程序,它可以打开然后读取用户指定的文件,目前我的代码如下所示:

    System.out.println("Enter the name of the file you want to open: ");
    FileN = scan.nextLine();
    // I want the program to return to this point here if an error has occured.
    try
    {
        scan = new Scanner(new File (FileN));
    }
    catch(Exception e)
    {
        System.out.println("Could not find file" + e);
        System.out.println("Please enter a valid file name: ");

    }

我已经在上面指定了我希望程序在代码中返回的位置,我目前尝试创建一个循环,然后使用 continue 但是它不会让我在循环中尝试。此外,我尝试创建一个新的 void,但它仍然无法正常工作。目前,即使用户输入了无效的文件名,程序也会继续运行。

我已经搜索过答案,只能找到与我想要的相关的答案:Java - Exception handling - How to re-enter invalid input

还通过循环尝试来阐明我的意思;对的,这是可能的。但是我想知道是否要继续在我的程序中工作,我是将 try 放在循环中还是将循环放在 try 中?我参考过:Should try...catch go inside or outside a loop?

This is the error I'm currently getting with my latest code

【问题讨论】:

  • “它不会让我在循环中尝试”——请解释一下
  • 请勿以 cmets 的形式发布说明。 Edit 你的问题。
  • 如果你想捕获一个异常然后回到循环的开始,try/catch 肯定需要inside你的循环。
  • @khelwood 你认为哪个循环最适合我想要创建的程序,效率方面。
  • while 循环适用于此。 “效率明智”是无关紧要的。在担心效率之前先做一些工作。

标签: java exception java.util.scanner


【解决方案1】:

你可以试试while循环:

        boolean again =true;

    while(again){
     FileN = scan.nextLine();

            try
            {
                scan = new Scanner(new File (FileN));
                again=false;
            }
            catch(Exception e)
            {
                System.out.println("Could not find file" + e);
                System.out.println("Please enter a valid file name: ");

            }}

【讨论】:

  • 您需要将输入放入again。否则它只会循环一次
【解决方案2】:

您的问题是您的操作顺序不正确。这是您的订单:

  • 处理文件
  • 文件不存在时报错
  • 要求一个新的文件名

我建议这种方法:

  • 询问文件名
  • 检查文件是否存在
  • 如果不存在,再询问
  • 处理文件

简而言之,我的做法是:

  • 阅读一些输入
  • 验证输入。如果不好做一些错误处理
  • 进一步处理输入

回到你的问题:创建一个循环询问文件名,直到File.exists() 返回真。也许还要检查File.isFile()(这样人们就无法进入目录)。

仅在循环之后创建扫描仪。它仍然会抛出异常(Java 不知道您已经确定文件存在)。但是异常处理程序代码不需要询问文件名(所以那里没有循环)。

【讨论】:

  • 没错。 exception 条件除外。用户输入无效文件也不例外。
  • 所以我目前已经按照建议重新排序了我的操作顺序,但是它不允许我捕获 FileNotFoundException,因此只是不断请求用户输入输入。
  • 加倍努力或详细解释为什么你无法捕捉到异常。
【解决方案3】:

如果你使用 Exception 来处理意料之外的事情,它会变得更容易一些。正如预期的那样,不存在的文件并不是真正的例外。文件存在但无法打开,或者正在打开但内容为零,即使它有 1MB 的内容是意外的,例外也是如此。考虑到文件不存在的预期行为(因为它是由用户输入的,可能输入不正确),您可以使用类似:

boolean fileExists = false;
File newFile;
while(!fileExists) {
  System.out.println("Enter the name of the file you want to open: ");
  FileN = scan.nextLine();
  newFile = new File(FileN);
  fileExists = newFile.exists();
  if (!fileExists) {
    System.out.println(FileN + " not found...");
  }
}
try {
    Scanner scan;
    scan = new Scanner(newFile);
    ... do stuff with the scanner
}
catch(FileNotFoundException fnfe) {
  System.out.println("sorry but the file doesn't seem to exist");
}

【讨论】:

  • 如何捕获 FileNotFoundException,因为这目前在代码中显示错误。如果我抛出 FileNotFoundException,程序可以运行,但是它不会通知用户找不到文件或发生错误,它只是不断请求用户输入输入。
  • 没有 FileNotFoundException 因为 exists() 不会抛出它。我更新了代码以向用户显示一条消息,告诉他们该文件不存在。在到达 Scanner 之前,您不需要抛出或捕获任何异常。
  • 请检查我的问题中包含的图片。
  • 当你设计得很好时,不要依赖于非异常事物的异常,你会遇到 Java 本身关于文件不作为异常存在的问题。我已经更新了代码以显示如何处理它。如果另一个进程正在清理目录并且您找到了该文件,但在调用扫描程序的几毫秒内,该文件已被删除,则可能会发生这种情况!请注意 catch 块是如何在程序末尾的,并且您在 try 块中使用扫描器。 try 块是“成功”路线。 catch 块是您处理不“成功”的事情的地方
  • 谢谢,现在可以完美运行了。多次测试,每次都成功。
猜你喜欢
  • 1970-01-01
  • 2014-01-20
  • 1970-01-01
  • 2014-09-02
  • 2013-12-10
  • 2013-10-04
  • 2010-10-03
  • 2020-02-13
  • 2020-07-13
相关资源
最近更新 更多