简单的if语句问题

时间:2010-12-01 14:46:12

标签: java if-statement tostring

如果有的话,我试图返回一个toString。

我有这段代码:

    public void printoutsailings() {
    for (Sailing s:sailings) {
        String hamburg = ("Hamburg");
        if ((s.getDeparturePort()) == hamburg) {
            System.out.println(s.toStringAdjusted());
        }

  }
}

然而,当我运行该方法时,我什么也得不到(当我应该得到一些东西时)。我假设我已经以某种方式弄乱了逻辑或不理解=,==和eq正确,我不太确定。

toString或for循环没有任何问题,我没有得到任何编译器或运行时错误。这只是逻辑错误。

如果有人能说得对我那么感激。感谢。

10 个答案:

答案 0 :(得分:9)

您应该使用.equals()代替==来检查String平等。请尝试以下方法:

if ((s.getDeparturePort()).equals(hamburg)) {
    System.out.println(s.toStringAdjusted());
}

简而言之,==检查两个字符串是否完全相同,.equals()检查两个字符串是否相同。

还应该说,您需要使用.equals()来检查任何Object类型的相等性,而不仅仅是字符串。只有原始类型(intdoublechar)才能使用==来实现相等。

为了弥补出发可能为空的事实,只需切换条件即可。它会显示为 - hamburg.equals(s.getDeparturePort())

答案 1 :(得分:6)

是的,你依靠==比较平等而不是身份。将代码更改为:

if (s.getDeparturePort().equals("hamburg")) {
    System.out.println(s.toStringAdjusted());
}

对于引用类型,= 总是表示“比较两个引用是否相等”。换句话说,它返回两个引用是否引用同一个对象。

您要检查两个字符串是否相等 - 即它们是否包含相同的字符序列。这就是被覆盖的equals方法的用途。

(为了真实地展示这一点,我每天早上都会乘坐36路公共汽车。对我来说,这些公共汽车相等因为他们带我走同一条路线,但我知道有几辆36号巴士 - 我每天都没有乘坐完全相同的物理巴士。)

请注意,如果NullPointerException返回s.getDeparturePort(),则上面的代码会抛出null。有两种方法可以避免这种情况。首先,您可以使用已知的非null引用作为方法调用的目标:

if ("hamburg".equals(s.getDeparturePort()))

或者,您可以执行显式无效检查:

String port = s.getDeparturePort();
if (port != null && port.equals("hamburg"))

或者你可以让它抛出异常,如果这是最合适的行为(即如果你真的不希望getDeparturePort()返回null,并且如果你得到这么糟糕的数据而不想爆炸继续并可能传播问题。)

答案 2 :(得分:3)

您必须使用equals方法比较字符串。

在Java中,String引用类型。这意味着指向堆栈中的变量的String hamburg包含引用到实际包含该字符串的托管堆对象。相反,值类型完全分配到堆栈中。

==,读取引用等于比较堆栈值。相反,所有类都实现了一个{em}值比较的equals方法。它比较了对象的实际值,无论它们分配在哪里。

以下代码适合您:

public void printoutsailings() { 
    for (Sailing s:sailings) { 
        String hamburg = ("Hamburg"); 
        if (hamburg.equals(s.getDeparturePort())) { //First hamburg to prevent any possible NullPointerException
            System.out.println(s.toStringAdjusted()); 
        } 

  } 
} 

只是为了你的好奇心:

  1. PHP仅按值进行比较
  2. C#将==运算符重新定义为值等于运算符,但{strong>仅 string
  3. 在VB.NET中,默认的=运算符是值等于运算符。 Is运算符对应引用等于

答案 3 :(得分:3)

在字符串中,通过equals()方法或compareTo()方法检查相等性。

您的解决方案可以通过以下方式修复:

if (s.getDeparturePort().equals(hamburg)) {
    System.out.println(s.toStringAdjusted());
}

为避免从null收到s.getDeparturePort(),我会执行以下操作。

if ("Hamburg".equals(s.getDeparturePort())) {
    System.out.println(s.toStringAdjusted());
}

这是为了避免NullPointerException如果s.getDeparturePort()null(来自您的示例代码)。

或者,您可以使用compareTo()方法,如此......

您更改的代码(使用compareTo()

if (s.getDeparturePort().compareTo(hamburg) == 0) {
    System.out.println(s.toStringAdjusted());
}

我的备用解决方案(使用compareTo()

if ("Hamburg".compareTo(s.getDeparturePort()) == 0) { //Zero means that it is equal.
    System.out.println(s.toStringAdjusted());
}

顺便说一句...

String hamburg = ("Hamburg");

可以很容易地写成

String hamburg = "Hamburg";

答案 4 :(得分:2)

if(hamburg.equals(s.getDeparturePort()))

答案 5 :(得分:1)

尝试

public void printoutsailings() {
    for (Sailing s:sailings) {
        String hamburg = "Hamburg";
        if (s.getDeparturePort().equals(hamburg)) {
            System.out.println(s.toStringAdjusted());
        }
    }
}

答案 6 :(得分:1)

==正在比较对象本身,最好使用.equals(),因为它会比较String的实际值,例如:

if ((s.equals(hamburg)) {
            System.out.println(s.toStringAdjusted());
        }

同时确保Sailings至少有1个值,否则你永远不会输入for循环

答案 7 :(得分:0)

而不是简单地提供代码...检查this,我几乎可以肯定它会让你到达你需要去的地方......

答案 8 :(得分:0)

尝试if (s.getDeparturePort().equals(hamburg))

答案 9 :(得分:0)

不使用== for String对象(或任何对象),而是使用.compareTo(),如下例所示:

http://leepoint.net/notes-java/data/strings/12stringcomparison.html