或管道不工作?

Mel*_*lon 8 java or-operator

对于我的第一个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?");
Run Code Online (Sandbox Code Playgroud)

开始和开始工作,但第一个字母小写像我使用|| 因为没有.当我使用那些我必须重新启动它因为我不能输入任何东西,但我显然有或管道说要使用任何一个.有谁知道是什么原因引起的?

Ada*_*zyk 16

in.nextLine().equals("Start") || in.nextLine().equals("start")
Run Code Online (Sandbox Code Playgroud)

这将从左到右执行,因此首先in.nextLine().equals("Start")执行.

让我们说你输入"start".左侧回归false.整个表达的评估仍在继续.右侧执行,in.nextLine().equals("start").所以,它读取另一行,等待你的另一个输入.这不是你想要的.

要解决此问题(这也是一般规则):不要更改if条件中的状态.换句话说:条件中的表达应该没有副作用.

您可以将正在更改状态的方法的结果分配给in.nextLine()引用:

String line = in.nextLine();
if (line.equals("Start") || line.equals("start"))
Run Code Online (Sandbox Code Playgroud)

您还可以编写如下条件:

if (line.equalsIgnoreCase("start"))
Run Code Online (Sandbox Code Playgroud)

要么

if (line.toLowerCase().equals("start"))
Run Code Online (Sandbox Code Playgroud)

现在,任何案件组合都可以,甚至"START".

最后但并非最不重要:这些||不称为管道.如果在编程上下文中使用"管道"一词,很多人会在命令行中考虑Unix管道,|符号.

在Java中||是" 逻辑或运算符"," 逻辑或".要区分" 二进制或" |,这是非常不同的.

  • `str.toLowerCase().equals("something")`总是看起来像`str.equalsIgnoreCase("something")的脏妹妹`:D. (3认同)
  • @Tom至少要说"肮脏的小*兄弟*",以免有人觉得被冒犯了...... (2认同)

Ank*_*jan 6

String str = in.nextLine();
str.equalsIgnoreCase("Start");
Run Code Online (Sandbox Code Playgroud)

它将检查较低和较高的情况.您不需要两次调用equals()方法,因此它将优化您的代码和可读性.

我希望这能解决你的问题.