如果有的话,我试图返回一个toString。
我有这段代码:
public void printoutsailings() {
for (Sailing s:sailings) {
String hamburg = ("Hamburg");
if ((s.getDeparturePort()) == hamburg) {
System.out.println(s.toStringAdjusted());
}
}
}
然而,当我运行该方法时,我什么也得不到(当我应该得到一些东西时)。我假设我已经以某种方式弄乱了逻辑或不理解=,==和eq正确,我不太确定。
toString或for循环没有任何问题,我没有得到任何编译器或运行时错误。这只是逻辑错误。
如果有人能说得对我那么感激。感谢。
答案 0 :(得分:9)
您应该使用.equals()
代替==
来检查String
平等。请尝试以下方法:
if ((s.getDeparturePort()).equals(hamburg)) {
System.out.println(s.toStringAdjusted());
}
简而言之,==
检查两个字符串是否完全相同,.equals()
检查两个字符串是否相同。
还应该说,您需要使用.equals()
来检查任何Object
类型的相等性,而不仅仅是字符串。只有原始类型(int
,double
,char
)才能使用==
来实现相等。
为了弥补出发可能为空的事实,只需切换条件即可。它会显示为 - 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());
}
}
}
只是为了你的好奇心:
==
运算符重新定义为值等于运算符,但{strong>仅 string
类=
运算符是值等于运算符。 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