#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;
}
}