Looping Try Statement - PullRequest
       12

Looping Try Statement

3 голосов
/ 03 февраля 2012

Я пытаюсь зациклить блок try каждый раз, когда выдается исключение.

Примером может быть случай, когда программа запрашивает double, а пользователь вводит строку, поэтому выдается исключение 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
}

Ответы [ 3 ]

3 голосов
/ 03 февраля 2012

Я бы сделал это так же, как вы, возможно, добавив подсказку для повторного ввода.

while(true) {
  try {
    String s = read.nextLine();
    i = Integer.parseInt(s);
    break;
  } catch(NumberFormatException) {
    System.out.println("Please try again.");
    continue;
  }
}
3 голосов
/ 03 февраля 2012

Вместо того чтобы генерировать исключения в соответствии с вводом, сохраняйте свои ограничения на ввод данных пользователем, используя регулярные выражения. Регулярные выражения 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;
    }
}
0 голосов
/ 03 февраля 2012

В этом случае я бы предпочел поместить весь блок try внутри цикла. Я думаю, что это легче читать, чем пробовать:

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

Кроме того, я считаю более понятным написать while (true) для бесконечного цикла и обычно не использовать исключения для обработки пользовательского ввода.

...