Java: "if else"语句中的break语句

23
我一直遇到一个错误,没有else的if。
我也尝试了else if。
for (;;) {
    System.out.println("---> Your choice: ");
    choice = input.nextInt();
    if (choice==1)
        playGame();
    if (choice==2)
        loadGame();
    if (choice==3)
        options();
    if (choice==4)
        credits();
    if (choice==5)
        System.out.println("End of Game\n Thank you for playing with us!");
        break;
    else
        System.out.println("Not a valid choice!\n Please try again...\n");
}

如果你对如何呈现这段代码有更好的想法,请不要犹豫 :)

34
Java不是Python。仅因为两行代码有相同的缩进,就不能期望它们在同一个代码块中。 - Sinkingpoint
即使这样也无法完全解决问题。所有的 if 语句都需要与 else 连接起来。 - ᴇʟᴇvᴀтᴇ
5
难道不应该是“没有if的else”吗? - Martijn Courteaux
4个回答

27

在“if”语句中,“break”命令不起作用。

如果您从代码中删除“break”命令并测试该代码,则应发现该代码与具有“break”命令的代码完全相同。

“break”设计用于循环(for,while,do-while,增强型for和switch)内部使用。


3
如果if语句不在控制结构的循环/switch内,那么'break'命令在if语句中无法起作用。我认为这就是混淆的原因?如果用if语句中的'continue'语句更容易理解的话,可以试着想象一下。 - djangofan
1
@erez 这个问题很老了,但是Alan是正确的,break语句并不会跳出if语句。它只能跳出循环。你说的是错误的答案,然后重复了Alan所说的话,只是措辞不同。Alan的意思不是它不能在if语句中运行,而是它不能跳出if语句。请看最后一部分:“break”是为循环(for、while、do-while、增强型for和switch)设计的。 - George Xavier
1
在这种情况下,break的作用是跳出无限循环for(;;)。 - theking2
1
这在技术上是错误的。我知道指出这一点已经晚了几年,但在我看来,这仍然是相关的(并且是创建混乱代码的有趣提示)。你可以在任何地方使用break - 即使没有循环,你只需要给它一个标签并引用该标签。例如:test: if(someTest()) { doStuff(); if(!someOtherTest()) break test; }。要在没有语句的情况下使用它,您只需使用一个块:myBlock: { ...; break myBlock; } - TheKodeToad

20

因为您的else没有与任何东西相连。没有花括号的if仅包含紧随其后的单个语句。

if (choice==5)
{
    System.out.println("End of Game\n Thank you for playing with us!");
    break;
}
else
{
   System.out.println("Not a valid choice!\n Please try again...\n");
}

不使用大括号通常被视为一种不良实践,因为它可能会导致您遇到的确切问题。

此外,在这里使用switch更有意义。

int choice;
boolean keepGoing = true;
while(keepGoing)
{
    System.out.println("---> Your choice: ");
    choice = input.nextInt();
    switch(choice)
    {
        case 1: 
            playGame();
            break;
        case 2: 
            loadGame();
            break;
        // your other cases
        // ...
        case 5: 
            System.out.println("End of Game\n Thank you for playing with us!");
            keepGoing = false;
            break;
        default:
            System.out.println("Not a valid choice!\n Please try again...\n");
     }
 }         

请注意,我使用了一个while(boolean)循环而不是无限的for循环,这样可以轻松地退出循环。另一种方法是使用带标签的break


你想记下如何在循环中使用 break; 来跳出循环,因为在 switch 语句中使用 break; 只能跳出 switch 语句。 - clcto

9
问题在于您正在尝试在if语句中使用多个语句而不使用{}。目前您的代码会被解释为:
if( choice==5 )
{
    System.out.println( ... );
}
break;
else
{
    //...
}

您希望:

if( choice==5 )
{
    System.out.println( ... );
    break;
}
else
{
    //...
}

此外,正如Farce所述,最好对所有条件使用else if而非if,因为如果choice==1,它仍会进行检查以查看是否choice==5,这将失败,并且它仍会进入您的else块。
if( choice==1 )
    //...
else if( choice==2 )
    //...
else if( choice==3 )
    //...
else if( choice==4 )
    //...
else if( choice==5 )
{
    //...
}
else
    //...

一种更优雅的解决方案是使用 switch 语句。然而,break 只会从最内层的“块”中跳出,除非你使用标签。所以你需要给你的循环加上标签,并且在 case 是 5 的时候从标签处跳出:

LOOP:
for(;;)
{
    System.out.println("---> Your choice: ");
    choice = input.nextInt();
    switch( choice )
    {
        case 1:
            playGame();
            break;
        case 2:
            loadGame();
            break;
        case 2:
            options();
            break;
        case 4:
            credits();
            break;
        case 5:
            System.out.println("End of Game\n Thank you for playing with us!");
            break LOOP;
        default:
            System.out.println( ... );
    }
}

除了给循环贴上标签之外,你还可以使用一个标记来告诉循环停止。

bool finished = false;
while( !finished )
{
    switch( choice )
    {
        // ...
        case 5:
            System.out.println( ... )
            finished = true;
            break;
        // ...
    }
}

0

有些人去那里提供代码的替代实现,而操作码无法正常工作的原因是缺少一对{}

    if (choice==5) {
        System.out.println("End of Game\n Thank you for playing with us!");
        break;
    } else

你正在发布与9年前被接受的答案相同的代码,那么这里的意义是什么? - GhostCat
错过了那个,很抱歉。 - theking2
1
那就坦诚地说出来,然后删除你的回答。不要等着别人对它进行投票并删除它。 - GhostCat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接