Что такое цикл с контролем исключений? - PullRequest
4 голосов
/ 16 декабря 2011

Я пытаюсь ответить на вопрос в моем учебном пособии:

Написать цикл с контролем исключений, который зацикливается до тех пор, пока пользователь не введет целое число от 1 до 5.

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

    Scanner input = new Scanner(System.in);
    int a = 0;

    while(a <= 0 || a > 5)
    {
        try {
            a = input.nextInt();

            if(a <= 0 || a > 5)
                throw new OutOfRangeException(); //my own Excpt. class
        } catch (OutOfRangeException e) {
            System.out.println(e.getMessage());
        }
    }

Что вы, ребята, думаете? Я что-то здесь упускаю?

Ответы [ 6 ]

7 голосов
/ 16 декабря 2011

Я думаю, что ваше предложение catch должно быть за пределами цикла

 Scanner input = new Scanner(System.in);
 int a = 0;
 try
 {
    while(true)
    {       
        a = input.nextInt();
        if(a <= 0 || a > 5)
            throw new OutOfRangeException(); //my own Excpt. class
    } 
 }
 catch (OutOfRangeException e) {
    System.out.println(e.getMessage());
 }

На самом деле я не слышал термин "цикл с исключительным контролем", но я думаю, что это означает, что это бесконечный цикл, который выходит при исключении. Кажется логичным.

Как говорится в комментариях, если вам нужно выполнить цикл, пока пользователь не введет число от 1 до 5, условие для броска должно быть

 if(a >= 1 && a <= 5)
2 голосов
/ 16 декабря 2011

«Управляемый исключениями» не является стандартным термином, и в любом случае использование исключений для потока управления является общеизвестной плохой практикой. Но чтобы продемонстрировать это наиболее четко (т. Е. Плохо), я бы пропустил проверку цикла и просто написал while(true), чтобы цикл, очевидно, только контролировался исключением.

2 голосов
/ 16 декабря 2011

Действительно ужасный пример цикла, управляемого исключениями:

String[] array = new String[] {"a", "b", "c"};

try {
    for (int i = 0;;i++) {
        System.out.println(array[i]);
    } 
} catch (ArrayIndexOutOfBoundsException e) {

}

Вместо проверки условия и прекращения выполнения, когда условие больше не выполняется, например

i < array.length

мы выполняем цикл, пока не будет сгенерировано исключение. Это, конечно, действительно ужасно. Он загромождает код, и если вы вызываете метод внутри цикла, который также может вызвать исключение ArrayIndexOutOfBoundsException, исключение будет проглочено.

1 голос
/ 16 апреля 2014

«Цикл, управляемый исключениями», вероятно, означает, что цикл во время перехвата исключения исключается при достижении правильного ввода. Хотя этот термин, похоже, был навеян этим «учебным пособием».

Ответ Бобби почти готов, он просто пропустил 2 важные вещи в блоке catch, чтобы предотвратить его бесконечный цикл:

import java.util.InputMismatchException;
import java.util.Scanner;

public class LoopWhileException {

    public static void main(String[] args) {
        boolean isNumber = false;
        int number = 0;

        Scanner scan = new Scanner(System.in);

        while(!isNumber) {
            try {
                System.out.print("Enter an integer: ");
                number = scan.nextInt();

                System.out.print("Your integer is: " + number);

                scan.close(); // close resources for good practice

                // not true = false, exits loop on integer input
                isNumber = true; // break; can also be used

            } catch(InputMismatchException ime) {
                System.out.print("Input is not a number!\n\n");

                scan.nextLine(); // clears input buffer

                // not false = true, re-enters while loop on catch
                isNumber = false; 
            }
        }   
    }
}

Как уже упоминалось, циклические исключения, подобные этой, как правило, не являются принятой практикой, но это всего лишь справочная информация для так называемого сценария "контролируемого исключения".

1 голос
/ 16 декабря 2011

Благодаря моему дорогому другу мистеру Биг-Номеру, я смог выкопать пример для этого материала . Хотя раньше я никогда не слышал об этом термине, он внезапно становится понятным, как вы видите в примере:

Scanner scanner = new Scanner(System.in);
int number = 0;
boolean done = false;

while(!done) {
    try {
        number = scanner.nextInt();
        done = true;
    } catch( InPutMisMatchException ex) {
        // tell the user that that's not a number!
    }
}   

Я не могу гарантировать, что это действительно то, что означает руководство!

0 голосов
/ 19 декабря 2016

Я думаю, что принятый ответ является правильным и ближайшим.

Возможно, это относится к технике, описанной в этой книге, которая является почти такой же техникой: настройка производительности Jack Shirazi-Java (2-е издание) -O'Reilly Media (2003), глава 7.3.

Исключением является оптимизация цикла while: когда условие while не выполняется, исключение выходит из цикла без повторного тестирования условия. Но в этом случае, возможно, это не оптимизация, потому что он использует if для проверки условий вместо while.

Другая ссылка: http://etutorials.org/Programming/Java+performance+tuning/Chapter+7.+Loops+Switches+and+Recursion/7.3+Exception-Terminated+Loops

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...