在这里,我想把几行作为输入,直到在其中一行中只输入'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,但我想
我的代码如下:
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]);
}
}
}
答案 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 thisblock
从thisblock
标签中断,而不是从循环中断。
鉴于此事实以及您的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]);
}