动态if语句评估问题与字符串比较

时间:2010-05-15 03:22:41

标签: java

我尝试了this thread中给出的示例 使用BeanShell动态创建if语句。但它没有正常工作。我没有使用“age”变量作为整数,而是在下面的示例中使用了string。我作为答案“失败”而不是“成功”。

任何人都可以帮助我吗?

/*
To change this template, choose Tools | Templates
and open the template in the editor.
*/

import java.lang.reflect.*;
import bsh.Interpreter;

public class Main {
  public static String d;

  public static void main(String args[])
  {
    try {
      String age = "30";

      String cond = "age==30";


      Interpreter i = new Interpreter();

      i.set("age", age);

      System.out.println(" sss" + i.get("age"));

      if((Boolean)i.eval(cond)) {
        System.out.println("success");
      } else {
        System.out.println("fail");
      }
    }
    catch (Throwable e) {
      System.err.println(e);
    }
  }
}

谢谢, 玛尼

5 个答案:

答案 0 :(得分:1)

您必须选择数字比较或字符串比较。这需要使用兼容的条件和年龄类型。

数值:

  int age = 30;
  String cond = "age==30";

字符串:

  String age = "30";
  String cond = "age.equals(\"30\")";

答案 1 :(得分:0)

当您使用==运算符比较两个对象时,您将比较两个引用。你实质上是在询问两个不同的名称是否指向内存中的同一个对象。

要比较对象的实际,您需要使用equals()方法。这对于理解Java非常重要。

答案 2 :(得分:0)

您正在使用==来比较字符串类型。请尝试使用age.equals("30")

编辑:显示正常工作

如果您将其用作cond的定义:

String cond = "age.equals(\"30\")";

输出:

 sss30
success

回答有关使用=="30"的问题,以下是答案:

如果你的String age被实习,因为它是一个编译时常量,那么可以为真。

final String age = "30";

但是,如果你明确地new String或者它没有被实习,那么它将是假的。

String age = new String("30");

您可以运行这两个示例以查看此效果。可能 - 你可能会得到fail

现在,仅仅因为存在实习并不意味着应该依赖它来比较String类型。 ==运算符只应用于比较基元,并比较引用类型以查看它们是否指向同一个对象,因此对于引用类型,我们可以说它看到两个对象是否相同而不是相等

有时通过JVM和JDK的魔力,String和其他原始包装器(如Integer)可能与==相当,但这种情况有限且不可靠。< / p>

答案 3 :(得分:0)

@Matthew Flaschen是正确的。另外,您可以按如下方式简化输出:

System.out.println(cond + " is " + i.eval(cond));

产生

  

年龄== 30是真的

答案 4 :(得分:0)

字符串与&#34; ==&#34;在bsh解释器中没有像预期的那样工作。

它的工作原理如下:(从下面的链接复制)

    Beanshell handles '==' like java and not e.g. like JavaScript. That means you've got to use "equals" to compare instances.
    bsh % "abc" == "abc"; => true
    bsh % "abc" == new String("abc"); => false
    bsh % "abc".equals("abc"); => true
    bsh % "abc".equals(new String("abc")); => true

此处提供更多信息:https://code.google.com/p/beanshell2/issues/detail?id=86

所以你必须使用&#34; .equal()&#34;,或编译你自己的bsh版本,就像我做的那样。 (阅读上面的完整问题)