管道或管子是否无法工作?

8

对于我的第一个Java项目,我正在尝试制作一个简单的基于文本的游戏。似乎竖线符号(或者)不起作用,当我尝试在其后输入时它不起作用;我必须重新启动。

    public void GameStart() {
    String playerName = "Player";
    String Command = "Choice";
        System.out.println("Type Start to start game!");
    if(in.nextLine().equals("Start") || in.nextLine().equals("start")) {
        Help();
        print("Type Begin to start game :D");
        if(in.nextLine().equals("Begin") || in.nextLine().equals("begin")) {
            System.out.println("Who are you?");

Start和Begin都可以正常工作,但像我使用的小写第一个字母||一样不行。当我使用它们时,我必须重新启动它,因为我无法输入任何内容,但我明显有或管道符,表示可以使用其中任何一个。有人知道是什么原因导致这种情况吗?


7
当你调用 in.nextLine() 时,会从输入流中读取一行文本。 - njzk2
in.nextLine() 可能正在等待更多的输入。尝试将输入保存在一个变量中,并检查该变量的值。 - Mike G
作为一般规则,我发现永远不要在其他计算/评估的“内联”中进行状态更改是很有用的。(在您的情况下,状态更改是当您读取输入时,这是与布尔条件“内联”的。例如,在增量中,例如 i++。)我发现,如果将它们保持分开,就更清晰易懂,并且更容易正确执行。在其他操作之前或之后放置状态更改,在一个单独的语句中。如果您在此处这样做,您的问题将永远不会发生。 - jpmc26
3个回答

16
in.nextLine().equals("Start") || in.nextLine().equals("start")

这段代码将从左到右执行,所以首先会执行in.nextLine().equals("Start")

假设您输入"start"。左侧返回false。 然后继续评估整个表达式。右侧被执行:in.nextLine().equals("start")。因此,它会读取另一行,等待您的另一个输入。这不是您想要的。

为了解决这个问题(这也是一般规则): 不要在if条件中改变状态。换句话说:条件中的表达式不应具有副作用

您可以将修改状态的方法的结果in.nextLine()分配给一个引用:

String line = in.nextLine();
if (line.equals("Start") || line.equals("start"))

您还可以这样编写条件:

if (line.equalsIgnoreCase("start"))
或者
if (line.toLowerCase().equals("start"))

现在,任何大小写组合都可以,甚至是"START"

最后但并非最不重要的一点:这些||不叫做管道。如果您在编程上下文中使用单词“pipe”,很多人会想到Unix管道,命令行中的|符号。

在Java中,||是“逻辑或运算符”、“逻辑或”。与“二进制或”,|区别很大。


3
str.toLowerCase().equals("something") 看起来总是像 str.equalsIgnoreCase("something") 的不堪姐姐 :D。 - Tom

6
String str = in.nextLine();
str.equalsIgnoreCase("Start");

它会检查大小写。您不需要两次调用equals()方法,因此它将优化您的代码和可读性。
希望这可以解决您的问题。

谢谢,这个方法可行!不过对我来说应该用equalsIgnoreCase而不是equal :P - Melon
谢谢你纠正我。是 equalsIgnoreCase!! 语法错误 :P - Ankur Mahajan
@AnkurMahajan 这不是语法错误,它将是“找不到符号”错误 :p - Adam Stelmaszczyk

3

将扫描仪输入存储在字符串中,如下所示:

 userInput = in.nextLine();

然后在你的条件语句中进行评估。

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