Java: как сделать try-catch условным в цикле for? - PullRequest
0 голосов
/ 28 апреля 2010

Я знаю, как решить проблему, сравнивая размер с верхней границей, но я хочу условное выражение, которое ищет исключение. Если в условном случае возникает исключение, я хочу выйти.

import java.io.*;
import java.util.*;

public class conditionalTest{
        public static void main(String[] args){

                Stack<Integer> numbs=new Stack<Integer>();
                numbs.push(1);
                numbs.push(2);
                for(int count=0,j=0;try{((j=numbs.pop())<999)}catch(Exception e){break;}&&
                                !numbs.isEmpty(); ){
                                System.out.println(j);
                }
                // I waited for 1 to be printed, not 2.

        }
}

Некоторые ошибки

javac conditionalTest.java
conditionalTest.java:10: illegal start of expression
            for(int count=0,j=0;try{((j=numbs.pop())<999)}catch(Exception e){break;}&&
                                ^
conditionalTest.java:10: illegal start of expression
            for(int count=0,j=0;try{((j=numbs.pop())<999)}catch(Exception e){break;}&&
                                   ^

Ответы [ 2 ]

6 голосов
/ 28 апреля 2010

Вы не должны использовать Exception для нормального потока управления, и вы не можете использовать оператор в качестве условия завершения цикла, которое должно быть выражением boolean .

В данном конкретном случае похоже, что вы можете использовать !numbs.isEmpty() && (j=numbs.pop()) < 999. Это работает, потому что && является коротким замыканием, и если левая рука - false, она не будет оценивать правую руку (которая бросила бы Exception), так как нет необходимости: общее выражение - false тем не менее.

Это короткое замыкание && также используется в конструкциях, подобных этой:

if (s != null && s.startsWith("prefix")) { ...
0 голосов
/ 12 июня 2012

Другой подход заключается в том, чтобы просто использовать try-catch внутри цикла for для запуска установленного числа раз.

Пример:

for (int i = 0; i < 1000; i++) {
try {
// do risky stuff that might not work
    }
catch (Exception e) {
break;
    } // end catch
} // end for loop.

Что происходит: либо выне хватило времени (int у меня больше 1000 и цикл прерывается естественным образом), ИЛИ то, что вы пробовали, на этот раз не сработало, поэтому улов ударил и вызвал "break" (выбивает вас из цикла for).

Еще один способ сделать это с помощью цикла while, например:

int number = 10;
boolean badStuff = false;
while (!badStuff) {
// do stuff you want
   number = number--; // reassign the number to 9, then 8, then 7, and so on.
   if (number = 1) {
     badStuff = true; // or you could skip having a boolean at all and just call break
       }
    } // end while loop

Пока! BadStuff оценивается как true (т. Е. Вы объявили плохие вещи как false, поэтому! BadStuff будет иметь значение true) цикл будет продолжен.Внутри цикла вы можете установить «badStuff = true» в операторе if для контроля при выходе.Каждый раз, когда цикл запускается, он проверяет! BadStuff, а затем оператор if внутри цикла.Здесь badStuff - логическое значение (т. Е. Всегда true или false), в данном случае называемое «флагом» (машет им, чтобы вызвать изменение).

...