Посмотрите следующий код (Java)
while((str=br.readLine())!=null)
{
int tempCounter=0;
for(int i=0;i<str.length();i=i+3)
{
String word = str.substring(i, i+3);
// System.out.println(word);
int insert = db.insert(index, word);
if(insert<0)
{
break;
}
tempCounter++;
}
index++;
System.out.println("Index Updated: "+index);
System.out.println(String.valueOf("Total words in this run: "+tempCounter));
if(index==5)
{
break;
}
}
если insert
меньше 0, мне нужно сломать как циклы for
и while
. Как я могу это сделать?
Проблема здесь в том, что мне нужно разбить "обе" циклы, если insert
меньше 0. И вы не можете добавлять две команды break
один за другим, даже с метками.
Вы можете попробовать этот простой пример, чтобы увидеть, как работает меченый цикл:
public static void main(String[] args) {
int i = 0; int j = 0;
EXIT: for (; i < 10; i++) {
for (; j < 10; j++) {
if (i * j > 50) {
break EXIT;
}
}
j = 0;
}
System.out.printf("Finished with i=%s and j=%s\n", i, j);
}
ВЫВОД:
Finished with i=6 and j=9
for
циклов и if
операторы без скобок, не означает, что вы должны ...
ИМО, исключение нецелесообразно; ярлык редко встречается и вряд ли будет понят будущим читателям.
Вызывая принцип KISS, почему бы не просто использовать дополнительный флаг и увеличить выражение, используемое в каждом цикле:
boolean isInsertFail = false;
while((! isInsertFail) && (str=br.readLine())!=null))
{
int tempCounter=0;
for(int i=0;(! isInsertFail) && i<str.length();i=i+3)
{
String word = str.substring(i, i+3);
// System.out.println(word);
int insert = db.insert(index, word);
if(insert<0)
{
isInsertFail = true;
}
tempCounter++;
}
if (!isInsertFail) {
index++;
System.out.println("Index Updated: "+index);
System.out.println(String.valueOf("Total words in this run: "+tempCounter));
if(index==5)
{
break;
}
}
}
Обратите внимание, что в Eclipse можно щелкнуть по isInsertFail
, и подсветка синтаксиса должна проиллюстрировать его использование.
label
и прерывание только того, что тоже нарушит вспомогательный цикл?
+1.. @AntonH.. label - это первый вариант. Если вы запутались, как использовать метку.. вы можете использовать логическую переменную, как показано ниже.
while (...) {
boolean brk = false;
for (...) {
if(insert<0)
{ brk = true;
break;
}
}
if(brk)
{
break;
}
}
Ваш вопрос уже частично ответил здесь. Используйте метку перед линией цикла while, например OUTMOST, тогда, когда вставка меньше 0, "break OUTMOST". Например:
OUTMOST:
while(someCondition) {
for(int i = 0; i < someInteger; i++) {
if (someOtherCondition)
break OUTMOST;
}
}
while((str=br.readLine())!=null)
{
int tempCounter=0;
boolean check = false;
for(int i=0;i<str.length();i=i+3)
{
String word = str.substring(i, i+3);
// System.out.println(word);
int insert = db.insert(index, word);
if(insert<0)
{
check = true;
break;
}
tempCounter++;
}
index++;
if(check)
break;
System.out.println("Index Updated: "+index);
System.out.println(String.valueOf("Total words in this run: "+tempCounter));
if(index==5)
{
break;
}
}
Вы можете сделать это
Один из подходов заключается в использовании исключения, в зависимости от ожидаемого результата процедуры db.insert.
Короче говоря, создайте новое исключение EDBInsertionException (класс, расширяющий исключение) и создайте исключение в цикле for.
try
{
while((str=br.readLine())!=null)
{
int tempCounter=0;
for(int i=0;i<str.length();i=i+3)
{
String word = str.substring(i, i+3);
// System.out.println(word);
int insert = db.insert(index, word);
if(insert<0)
{
throw new EDBInsertionException("No record inserted: " + insert);
}
tempCounter++;
}
index++;
System.out.println("Index Updated: "+index);
System.out.println(String.valueOf("Total words in this run: "+tempCounter));
if(index==5)
{
break;
}
}
}
catch (EDBInsertionException e)
{
// MZ: The database insertion has failed
log.error(e.getMessage(), e);
// MZ: Supplemental action: Delegate, escalate, rollback, etc
}
РЕДАКТИРОВАТЬ
Развернутый пример, иллюстрирующий потенциальное использование исключения (пользователя).