简单的if语句问题

Ben*_*ith 4 java if-statement tostring

如果某些事情是真的,我试图返回一个toString.

我有这个代码:

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

  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

如果有人能把我说得对,那将是值得赞赏的.谢谢.

jjn*_*guy 9

您应该使用.equals()而不是==检查String相等性.请尝试以下方法:

if ((s.getDeparturePort()).equals(hamburg)) {
    System.out.println(s.toStringAdjusted());
}
Run Code Online (Sandbox Code Playgroud)

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

还应该说你需要.equals()用来检查任何Object类型的相等性,而不仅仅是字符串.只有原始类型(int,double,char)应该使用==平等.

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


Jon*_*eet 6

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

if (s.getDeparturePort().equals("hamburg")) {
    System.out.println(s.toStringAdjusted());
}
Run Code Online (Sandbox Code Playgroud)

对于引用类型,Java中的== 始终表示"比较两个引用是否相等".换句话说,它返回两个引用是否引用同一个对象.

您想要检查两个字符串是否相等 - 即它们是否包含相同的字符序列.这就是重写equals方法的用途.

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

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

if ("hamburg".equals(s.getDeparturePort()))
Run Code Online (Sandbox Code Playgroud)

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

String port = s.getDeparturePort();
if (port != null && port.equals("hamburg"))
Run Code Online (Sandbox Code Playgroud)

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