或管道不工作?

Posted

技术标签:

【中文标题】或管道不工作?【英文标题】:Are the or pipes not working? 【发布时间】:2015-10-28 18:47:12 【问题描述】:

对于我的第一个 Java 项目,我正在尝试制作一个简单的基于文本的游戏。似乎 or 管道不起作用,当我尝试在它不起作用之后输入一些东西时;我必须重新启动它。

    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 and Begin 有效,但第一个字母小写,就像我使用的 ||因为没有。当我使用它们时,我必须重新启动它,因为我无法输入任何内容,但我显然有或管道说要使用其中任何一个。有谁知道是什么原因造成的?

【问题讨论】:

你认为当你打电话给in.nextLine()时会发生什么? in.nextLine() 可能正在等待更多输入。尝试将输入保存在变量中并检查其值。 作为一般规则,我发现从不使状态更改与其他计算/评估“内联”很有用。 (在您的情况下,状态更改是在您读取输入时,您使用布尔条件“内联”。另一个递增示例,例如i++。)让他们分开。将其他操作之前或之后的状态更改放在单独的语句中。如果您在这里这样做,您的问题就不会发生。 【参考方案1】:
in.nextLine().equals("Start") || in.nextLine().equals("start")

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

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

要解决这个问题(这也是一般规则):不要更改 if 条件中的状态。换句话说:条件中的表达式应该没有side effects

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

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

条件也可以这样写:

if (line.equalsIgnoreCase("start"))

if (line.toLowerCase().equals("start"))

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

最后但同样重要的是:这些|| 不称为管道。如果在编程上下文中使用“管道”一词,很多人会想到命令行中的Unix pipes、| 符号。

在 Java 中|| 是“逻辑 或运算符”、“逻辑 或”。用“binary or”来区分,|,这是很不一样的。

【讨论】:

str.toLowerCase().equals("something") 总是看起来像str.equalsIgnoreCase("something") 的脏姐姐:D。【参考方案2】:
String str = in.nextLine();
str.equalsIgnoreCase("Start");

它将检查大小写。您不需要调用 equals() 方法两次,因此它将优化您的代码和可读性。

希望这能解决您的问题。

【讨论】:

感谢这工作!虽然,对我来说,它是 equalsIgnoreCase 而不是 equal :P 感谢您的指正。是的,它是 equalsIgnoreCase !语法错误:P @AnkurMahajan 这不是语法错误,而是“找不到符号”错误:p【参考方案3】:

将扫描仪输入存储在这样的字符串中:

 userInput = in.nextLine();

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

【讨论】:

以上是关于或管道不工作?的主要内容,如果未能解决你的问题,请参考以下文章

命名管道未按预期工作。一遍又一遍地阅读相同的消息

C++ Shell 多管道不工作?

多管道C程序不起作用

3. Logstash8.1 工作原理

跨网络命名管道给出“用户名或密码不正确”

Node、Windows 10 和 Bash 交互。管道不工作