【问题标题】:Looping Try Statement循环尝试语句
【发布时间】:2012-02-25 19:34:36
【问题描述】:

我试图在每次抛出异常时循环一个 try 块。

一个例子可能是当程序提示输入一个双精度并且用户输入一个字符串时,就会抛出一个 NumberFormatException。所以程序会要求用户重新输入。

这是我目前正在做的事情。这是正确的方法还是有更好的方法?

// infinite loop
for (;;)
{     
    try 
    {
        //do something
        break; // if an exception is not thrown. it breaks the loop.
    }
    catch (Exception e)
    {
        //display the stack trace.
    }

    // restarts the for loop
}

【问题讨论】:

  • 嘿,我最近在blog 中处理了一个类似的问题,尽管使用的是不同的语言。 (见第 4 条)
  • 啊,好的。这个 sn-p 功能齐全。我只是想确保我的方法是一种普遍接受的方法。
  • 嗨,Marv,您可以查看我的示例代码。如果您要多次收集输入,您可以在开始时显示一次输入约束或每次都警告用户。它是捕获异常的好方法。使用这种技术,您也可以强制用户遵守您的输入约束,例如,它可用于控制希望仅接受特定字符串/数字模式的文本字段。

标签: java exception loops logic try-catch


【解决方案1】:

不要根据输入抛出异常,而是通过使用正则表达式来限制用户输入。 Java 正则表达式将在这一点上为您提供帮助。

import java.util.Scanner;
import java.util.regex.Pattern;

public class Sample
{
    private final static Pattern DIGITS = Pattern.compile( "\\d*" );

    public static void main ( String [] args )
    {
        Scanner scanner = new Scanner( System.in );
        while ( true )
        {
            String input = scanner.nextLine();
            if ( evalInput( input ) )
                process( input );
            else
                System.out.println("Input constraints: it must be just numerical.");
        }
    }

    public static void process ( String str )
    {
        // Whatever you wanna do with the accepted input.
    }

    public static boolean evalInput ( String str )
    {
        if ( str != null && DIGITS.matcher( str ).matches() )
            return true;
        return false;
    }
}

【讨论】:

  • 哇。当。奉献。这有很大帮助!
  • 我希望它有很大帮助。您可以检查 Java 正则表达式和模式的示例以获取复杂或更具体的输入。
【解决方案2】:

我会像你一样做,也许会添加一个重新输入的提示。

while(true) {
  try {
    String s = read.nextLine();
    i = Integer.parseInt(s);
    break;
  } catch(NumberFormatException) {
    System.out.println("Please try again.");
    continue;
  }
}

【讨论】:

  • 谢谢。有什么特别的原因可以说明为什么 while 循环比 for 循环更受欢迎?
  • 并非如此。 while(true)for(;;) 对我来说同样可读,但我更喜欢前者。
  • 完美。感谢您的帮助。
  • @Marv:因为它比 for 循环更具可读性。看看这里stackoverflow.com/questions/885908/…
  • 那为什么永远存在循环呢?一个 while (true) 循环不就足够了吗?
【解决方案3】:

在这种情况下,我宁愿将整个 try-block 放在循环中。我认为它比打破尝试更容易阅读:

while (true) {
    try {
        ...
    } catch (...) {
        ...
    }
}

另外,我发现为无限循环编写while (true) 更清楚,并且通常不会使用异常来处理用户输入。

【讨论】:

    猜你喜欢
    • 2020-10-09
    • 1970-01-01
    • 2020-06-22
    • 2015-08-05
    • 2014-05-20
    • 2018-02-28
    • 2015-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多