0

在这里,我想取几行作为输入,直到其中一行中只输入“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 行无法访问

我的代码如下:

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

4 回答 4

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")

于 2014-01-05T21:55:32.467 回答
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
于 2014-01-05T21:49:55.333 回答
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++;
}
于 2014-01-05T21:54:54.960 回答
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++;
}

counts 值是正确的。如果输入 5 个字符,然后输入0,count则为 5,但您需要for像这样初始化下一个循环:

for(int i=count-1;i>=0;i--)
{
    System.out.println(" "+inputs[i]);
}
于 2014-01-05T21:55:12.470 回答