使用带标签的break获得无法访问的语句错误

时间:2014-01-05 21:46:11

标签: java unreachable-code

在这里,我想把几行作为输入,直到在其中一行中只输入'0'。并按照输入方式的相反顺序打印这些行。但是,我在使用带标签的休息时遇到了困难。我收到以下错误:

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

我无法理解为什么第17行无法访问。 我知道我可以很容易地只使用'break'(不是标记的break)语句,允许'count'变量比实际应该增加一个然后,在打印时,这样做:for(int i=count-1;i>=0;i--)和避免打印0,但我想

  1. 将count的值停在正确的值上,
  2. 知道为什么第17行无法到达
  3. 我的代码如下:

    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]);
            }
        }
    }
    

4 个答案:

答案 0 :(得分: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")

答案 1 :(得分:1)

你的for循环永远不会结束,因为你没有设置终止条件,也没有在for的主体内“破坏”它。试试这个,你会看到:

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

您将获得相同的“不可检索的代码”。

修改

试试这个:

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

答案 2 :(得分:0)

您可以将break语句与各种循环一起使用,也可以单独使用标签。换句话说,以下工作

label:
    break label;

在您的代码中,break thisblockthisblock标签中断,而不是从循环中断。 鉴于此事实以及您的for循环没有终止表达式,编译器知道您的循环将永远不会结束,因此任何代码都将永远不会执行。

我不知道为什么你有标签,但在这种情况下,你可以简单地删除它。

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

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

答案 3 :(得分: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]);
}