Метки в Java для обработки исключений

#java #loops

#java #циклы

Вопрос:

Я выполняю сертификацию уровня Java Associate, и, хотя нам прямо сказано, что мы не будем тестироваться на ярлыках, нам их показали. Глядя здесь, хотя совет, похоже, никогда не использует метки?

Я хотел бы использовать их в блоке catch / консоли пользовательского ввода в качестве средства проверки ввода.

 do {//Keep calculator going as long as user wants               
            numInputCheck: 
            do {
                try {//Force user to input a whole number
                    System.out.print("nPlease enter the Mark you want to Calculaten(Enter marks between "   GradeCalculator.getMIN_MARK()   " and "   GradeCalculator.getMAX_MARK()   " only): ");
                    mark = Integer.parseInt(scn.nextLine());
                }catch(NumberFormatException nfe) {
                    System.out.println("nInvalid entry - Please ensure entry is a number only.");
                    continue numInputCheck;
                }   
                gradeCalc.isValidMark(mark);//Ensure input is within valid range
            }while(!gradeCalc.getIsValidMark());
            *etc*......
  

Это плохое кодирование?

РЕДАКТИРОВАТЬ: приведенный выше код делал не то, что я думал / хотел, чтобы он делал — на самом деле он вообще не возвращался к ярлыку.

В итоге я изменил код на

 do {//Keep calculator going as long as user wants
            do {//Force user to enter number within valid range
                do {//Force user to enter a whole number
                    try {
                        System.out.print("nPlease enter the Mark you want to Calculaten(Enter marks between "   GradeCalculator.getMIN_MARK()   " and "   GradeCalculator.getMAX_MARK()   " only): ");
                        mark = Integer.parseInt(scn.nextLine());
                        isValidInput = true;
                    }catch(NumberFormatException nfe) {
                        System.out.println("nInvalid entry - Please ensure entry is a number only.");
                        isValidInput = false;
                    }
                }while(!isValidInput);
            }while(!gradeCalc.isValidMark(mark));
  

который, я уверен, работает правильно.

В любом случае, я думаю, что я ответил на свой собственный вопрос — метки не поощряются, потому что такие люди, как я, пытаются их использовать.

Комментарии:

1. Я не думаю, что метка служит особой цели в этом точном примере, потому continue что должна применяться к внутреннему do циклу по умолчанию. Я мог бы не заходить так далеко, чтобы сказать, что это плохое кодирование, но я думаю, что большинство Java-гуру сказали бы, что метки не следует использовать, если они не нужны.

2. @TimBiegeleisen Этот комментарий — довольно хороший ответ 🙂

3. @TimBiegeleisen спасибо. Я об этом не подумал.

4. @tim нет, continue перейдет к while оценке (возможно, вызывая NPE)

5. @Strelok Итак, вы говорите, что continue это будет вести себя иначе continue numInputCheck , чем? Я только комментировал использование меток, а не остальной код.

Ответ №1:

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

     outerloop:while(condition1) {

                 while(condition2) {
                       if(condition3)
                           break outerloop;
                 }
          {
  

Ответ №2:

Оператор Continue пропускает все предложения выше, вы должны использовать предложение break для остановки цикла. Метки полезны для более чем одного цикла, например:

 label1:
for (int i = 0 ; i<10; i  ){
    for (int j = 0 ; j<10; j  ){
        if (i j = 3)
            break label1;
    }
}