Java 简单if语句问题
如果事情是真的,我试图返回一个toString 我有以下代码:Java 简单if语句问题,java,if-statement,tostring,Java,If Statement,Tostring,如果事情是真的,我试图返回一个toString 我有以下代码: public void printoutsailings() { for (Sailing s:sailings) { String hamburg = ("Hamburg"); if ((s.getDeparturePort()) == hamburg) { System.out.println(s.toStringAdjusted()); }
public void printoutsailings() {
for (Sailing s:sailings) {
String hamburg = ("Hamburg");
if ((s.getDeparturePort()) == hamburg) {
System.out.println(s.toStringAdjusted());
}
}
}
然而,当我运行这个方法时(当我应该得到一些东西时),我什么也得不到。我假设我把逻辑搞乱了,或者没有正确理解=、==和eq,我不太确定
toString或for循环没有任何错误,我没有得到任何编译器或运行时错误。只是逻辑是错误的
如果有人能纠正我,我将不胜感激。谢谢。试试看
public void printoutsailings() {
for (Sailing s:sailings) {
String hamburg = "Hamburg";
if (s.getDeparturePort().equals(hamburg)) {
System.out.println(s.toStringAdjusted());
}
}
}
您应该使用
.equals()
而不是=
来检查字符串是否相等。请尝试以下操作:
if ((s.getDeparturePort()).equals(hamburg)) {
System.out.println(s.toStringAdjusted());
}
简而言之,==
检查两个字符串是否是完全相同的引用,.equals()
检查两个字符串是否看起来相同
还应该说,您需要使用.equals()
来检查任何对象
类型的相等性,而不仅仅是字符串。只有基元类型(int
,double
,char
)应使用=
表示相等
为了补偿偏离可能为空的事实,只需切换条件即可。它会读为-hamburg.equals(s.getDeparturePort())
而不是简单地提供代码…检查一下,我几乎可以肯定它会让你到达你需要去的地方…试试if(s.getDeparturePort().equals(hamburg))
if(hamburg.equals(s.getDeparturePort())
是的,您依赖==比较来获得相等性,而不是一致性。将代码更改为:
if (s.getDeparturePort().equals("hamburg")) {
System.out.println(s.toStringAdjusted());
}
对于引用类型,Java中的==始终表示“比较两个引用是否相等”。换句话说,它返回两个引用是否引用同一个对象
您需要检查这两个字符串是否相等,即它们是否包含相同的字符序列。这就是重写的equals
方法的用途
(为了在现实世界中演示这一点,我每天早上都会乘坐36路公交车。对我来说,这些公交车是相等的,因为它们将我带到同一条路线上,但我知道有好几辆36路公交车——我并不是每天都乘坐完全相同的实体公交车。)
请注意,如果s.getDeparturePort()
返回null
,上述代码将抛出NullPointerException
。有两种方法可以避免这种情况。首先,您可以使用已知的非空引用作为方法调用的目标:
if ("hamburg".equals(s.getDeparturePort()))
或者,您可以执行显式空值检查:
String port = s.getDeparturePort();
if (port != null && port.equals("hamburg"))
或者,如果这是最合适的行为(即,如果您确实不希望getDeparturePort()
返回null,并且如果您得到如此糟糕的数据而不是继续并可能传播问题,那么您可以让它引发异常)。而不是对字符串对象(或任何对象)使用==,使用.compareTo(),如本例所示:
=
正在比较对象本身,最好使用.equals()
,因为它将比较字符串的实际值,例如:
if ((s.equals(hamburg)) {
System.out.println(s.toStringAdjusted());
}
还要确保Sailings
至少有1个值,否则无论如何都不会为循环输入该值必须使用equals
方法比较字符串
在Java中,String
是一种引用类型。这意味着您的字符串hamburg
,指向堆栈中的变量,包含对实际包含该字符串的托管堆对象的引用。相反,值类型完全分配到堆栈中
读取引用等于比较堆栈值。相反,所有类都实现了一个读取值比较的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());
}
}
}
出于好奇:
PHP仅按值进行比较
C#将=
运算符重新定义为值等于运算符,但仅用于字符串
类
在VB.NET中,默认的=
运算符是值等于运算符。Is
运算符对应于参考值
在字符串中,通过equals()
方法或compareTo()
方法检查相等性
您的解决方案可以通过以下方式修复:
if (s.getDeparturePort().equals(hamburg)) {
System.out.println(s.toStringAdjusted());
}
为了避免从s.getDeparturePort()
接收null
,我将执行以下操作
if ("Hamburg".equals(s.getDeparturePort())) {
System.out.println(s.toStringAdjusted());
}
这是为了避免NullPointerException
如果s.getDeparturePort()
是null
(来自示例代码)
或者,您可以像这样使用compareTo()
方法
您更改的代码(使用compareTo()
:
我的替代解决方案(使用compareTo()
)
顺便说一句
String hamburg = ("Hamburg");
可以很容易地写成
String hamburg = "Hamburg";
如果getDeparturePort()
返回null
,该怎么办?感谢您的解释,我简直不敢相信我能做到这一点,因为我已经在我的代码中的其他地方使用了equals()。我计划使用一个else if来避免nullpointerexception,它将覆盖所有其他基础。谢谢:)@jnguy,ifs.getDeparturePort()
为null,那么您的解决方案将抛出一个NullPointerException
@Elite Gentle:这可能是完全正确的做法,当然:)感谢您的解释,我不敢相信我做到了这一点,因为我已经在我的代码doh的其他地方使用了equals()!我计划使用一个else-if来避免nullpointerexception,它将覆盖所有其他基。谢谢:)@jngguy和@JonSkeet,或者他可以避免使用“汉堡”。equals(s.getDeparturePort())@josh同意。事实上,我在我的文章末尾已经有了这些信息。Java没有Equals
方法(我看到你也在代码中包含了它。相反,它有一个Equals()
方法。哈哈,看起来我把这个案例错放了。谢谢
String hamburg = ("Hamburg");
String hamburg = "Hamburg";