【问题标题】:Using string input as boolean使用字符串输入作为布尔值
【发布时间】:2015-11-07 18:33:32
【问题描述】:
    String input = sc.nextLine();
    System.out.println(Boolean.parseBoolean(input));

所以我的输入看起来像 1 > 2false || true,但我没有得到正确的值。

但是当我打电话时:

    Boolean x = 1 < 2;
    System.out.println(x);

我猜对了。所以我的问题是。 如何将字符串输入转换为返回布尔值?

到目前为止尝试过:

    Boolean.parseBoolean();
    Boolean.getBoolean();
    Boolean.valueOf();

感谢您的回答。

编辑

INPUT         -  OUTPUT
1 < 2         -  false(should be true)
false || true -  false(should be true)

【问题讨论】:

  • 执行代码时你得到了什么值?请在这里分享。

标签: java boolean user-input


【解决方案1】:

您可以为此使用ScriptEngine

ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
String input = "1 > 2";
System.out.println(engine.eval(input)); //prints false

【讨论】:

  • 我实际上是在 js 中完成的,但我不知道有 ScriptEngine 这样的东西,非常感谢!
【解决方案2】:

Boolean.parseBoolean(String) 实现为:

public static boolean parseBoolean(String s) {
    return ((s != null) && s.equalsIgnoreCase("true"));
}

因此,如果输入字符串不为空且等于true(忽略大小写),则返回true。否则返回false

您似乎期望Boolean.parseBoolean(String) 接受表达式字符串并评估该字符串,但事实并非如此。

【讨论】:

    【解决方案3】:

    当您编写System.out.println(1&lt;2); 时,它可以工作,因为println() 有一个重载版本,它采用布尔值。但是当你传递一个字符串时,它只会被视为字符串,而不是boolean

    另外Boolean.parseBoolean()总是以字符串格式的布尔值(true\false)作为参数,并以布尔格式返回对应的值,否则总是返回false

    【讨论】:

      【解决方案4】:

      Boolean.parseBoolean 根据docs 执行以下操作:

      public static boolean parseBoolean(String s)

      将字符串参数解析为布尔值。返回的布尔值 如果字符串参数不为 null 并且是 等于字符串“true”,忽略大小写。

      您正在尝试传入一个表达式,该表达式将 评估 为真或假,而不是字符串“true”或“True”或“TRUE”。因此,这将像这样工作:

      Boolean.parseBoolean("true"); // equals true
      Boolean.parseBoolean("1 > 2"); // not the string "true", therefore returns false.
      

      一般来说,您应该对字符串中包含的代码的动态执行非常谨慎。如果字符串是从用户那里传入的,那是非常危险的。我的建议是找到更好的方法。

      如果你真的需要这样做:

      • 其他答案之一提到使用ScriptEngine。请注意,这会将字符串评估为 JavaScript,而不是 Java。对于简单的布尔表达式,这可能没问题,但您应该注意这一点。 JavaScript 具有有时令人困惑的真实性规则,并且它们在 Java 中不会评估相同的规则。

      例如,尝试在 ScriptEngine 中运行它:

      1 > '0' // true in JavaScript, but probably unexpected in your code!
      
      • 如果你想在 Java 中正确地完成这一切,你可以使用Java Compiler API。不幸的是,这并不像简单地将表达式作为字符串提供给 ScriptEngine 那样简单。但是,This post 对于 Java 代码的内存编译可能很有用。

      【讨论】:

        猜你喜欢
        • 2021-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-07
        • 2019-10-17
        • 1970-01-01
        • 2018-09-15
        相关资源
        最近更新 更多