2014-01-05 1 views
0

Здесь я хочу взять несколько строк в качестве входных данных, пока в одну из строк не будет введено только «0». И напечатайте эти строки в обратном порядке, как они были введены. Как бы то ни было, я сталкиваюсь с трудностями в использовании помеченного перерыва. Я получаю следующую ошибку:ошибка ошибки недоступности, полученная с использованием помеченного перерыва

PrintRevOrderLines.java:17: error: unreachable statement 
       System.out.println("\nReversed order of lines is as follows..\n"); 
       ^
1 error 

Я не могу понять, почему строка 17 недоступна. Я знаю, что я могу легко использовать только оператор «break» (не помеченный перерыв), разрешить добавление переменной «count» еще больше, чем на самом деле, а затем, во время печати, сделать так: for(int i=count-1;i>=0;i--) и избежать печати 0 , но я хочу

  1. остановить значение счетчика на правильное значение и,
  2. знаю, почему линия 17 недостижим

Мой код выглядит следующим образом:

import java.io.*; 
class PrintRevOrderLines 
{ 
    public static void main(String[] args) throws IOException 
    { 
     int count = 0; 
     String inputs[] = new String[100]; 
     System.out.println("Enter 0 and hit enter to stop inputting values..\n"); 
     BufferedReader B = new BufferedReader(new InputStreamReader(System.in)); 
     for(int i=0;;i++) 
     thisblock: 
     { 
      inputs[i] = B.readLine(); 
      if(inputs[i].charAt(0)=='0'){break thisblock;} 
      count++; 
     } 
     System.out.println("\nReversed order of lines is as follows..\n"); 
     for(int i=count;i>=0;i--) 
     { 
      System.out.println(" "+inputs[i]); 
     } 
    } 
} 
+2

Примечание, где ваша метка и где 'break' бы верните. –

+0

@SotiriosDelimanolis Я попытался поместить метку после цикла в 'System.out.println (« \ nРасширенный порядок строк следующий. \ N ");' строка, но та же ошибка. – vipulnj

+0

просмотрите http: //docs.oracle.com/javase/tutorial/java/nutsandbolts/branch.html – vandale

ответ

1

Происходит то, что цикл for никогда не закончится, так как вы не устанавливаете условие завершения, и вы не «ломаете» его внутри тела for. Попробуйте это, и вы увидите:

for (int i = 0;; i++) 
    System.out.println("here"); 
System.out.println("\nReversed order of lines is as follows..\n"); 

Вы получите тот же «неудачный код».

Edit:

Попробуйте это:

boolean flag = false; 
for (int i = 0;; i++) { 
    thisblock: { 
     inputs[i] = B.readLine(); 
     if (inputs[i].charAt(0) == '0') { 
      flag = true; 
      break thisblock; 
     } 
     count++; 
    } 
    if (flag) 
     break; 
} 

Выход:

Reversed order of lines is as follows.. 

0 
3 
2 
1 
+0

Да, но как я вырваться из цикла и перейти к 'System.out.println (" \ nРасширенный порядок строк выглядит следующим образом .. \ n ");' строка? Я не могу понять, где/как я должен разместить свой оператор break и сам ярлык. – vipulnj

+0

Одним из способов было бы добавление переменной для проверки, когда вам нужно сломать. См. Править. – Christian

+0

Я заменил ваш код тем, что я набрал. Он больше не дает ошибку недостижимого утверждения. Можете ли вы указать, где я ошибался в использовании помеченного перерыва. Pretty embarassing coz с надписью break - очень простая концепция, но она действительно тестирует меня здесь. – vipulnj

0

Вы можете использовать break заявления с различными петлями, но и в одиночку с этикеткой. Другими словами, следующие работы

label: 
    break label; 

В вашем коде, то break thisblock ломается от thisblock этикетки, а не из петли. Учитывая, что ваш цикл for не имеет терминального выражения, компилятор знает, что ваш цикл никогда не закончится, и поэтому любой код, который появляется после него, никогда не будет выполняться.

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

for (int i = 0;; i++) { 

    inputs[i] = B.readLine(); 
    if (inputs[i].charAt(0) == '0') { 
     break; 
    } 
    count++; 
} 
0

Ваш break thisblock; вызывает вас, чтобы вырваться из thisblock (очевидно), который из-за его размещения внутри цикла for, вызывает цикл для перебора снова вместо выхода из него.

Поскольку для этого цикла нет другого пути, вы никогда не сможете выйти за пределы этой части функции. Обратите внимание: если вы удалите недоступную в данный момент часть кода, вместо этого будет выделен следующий for.

Просто используйте простой break вместо:

for(int i=0;i<100;i++) //i<100 check so you don't get an index exception when you that 101st character. 
{ 
    inputs[i] = B.readLine(); 
    if(inputs[i].charAt(0)=='0'){break;} 
    count++; 
} 

count сек значение правильно. Если вы вводите 5 символов и затем а 0, count будет 5, но вы должны инициализировать следующий for цикл, как это:

for(int i=count-1;i>=0;i--) 
{ 
    System.out.println(" "+inputs[i]); 
} 
+0

Я попытался поместить метку после цикла в 'System.out.println (« \ nРасширенный порядок строк следующий. \ N ");' строка, но та же ошибка. Я не могу понять, где/как я должен разместить свой оператор break и ярлык. – vipulnj

+0

Размещение перерыва в порядке, но поскольку вы только хотите выйти из цикла, вы не используете ярлык. – splrs

+0

Да, я пробовал делать то же, что вы предлагали здесь раньше, но значение переменной 'count' было больше, чем должно было быть на самом деле. Итак, я думал, что он ломается только из блока if и использует помеченный перерыв, чтобы вырваться из блоков «if» и «for». – vipulnj

2

Ваша структура кода ужасно грязный, что должно быть просто. Маркированные перерывы - это всегда плохая идея! Кроме того, если количество входных данных превышает 100, вы потерпите крах или если кто-то вводит число, начинающееся с 0, вы выйдете раньше (например, 0,3).

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

List<String> inputs = new ArrayList(); 
    System.out.println("Enter 0 and hit enter to stop inputting values..\n"); 
    BufferedReader b = new BufferedReader(new InputStreamReader(System.in)); 
    while (!(input = b.readLine()).equals("0")) { 
     inputs.add(input); 
    } 

    System.out.println("\nReversed order of lines is as follows..\n"); 
    for(int i=inputs.size()-1;i>=0;i--) { 
     System.out.println(" "+inputs.get(i)); 
    } 

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

(Кстати, я бы праведный был пустой входной выход, а не 0, в этом случае вы можете просто проверить на isEmpty() вместо equals("0"))