class Main
{
public static void main(String args[])
{
String myString = "test";
String myString2 = null;
if (myString.equals("test"))
{
System.out.println("Approach 1: myString.equals(\"test\") :Working if myString is not null");
}
if ("test".equals(myString))
{
if ("test".equals(myString2))
{
//This line wont execute
}
else
{
System.out.println("Approach 2: \"test\".equals(myString) :Working even if myString is null");
}
}
if ("test".compareTo(myString) == 0)
{
System.out.println("Approach 3: \"test\".compareTo(myString) == 0 :Working if myStrig is not null");
}
if (myString.compareTo("test") == 0)
{
System.out.println("Approach 4: myString.compareTo(\"test\") == 0 :Working if myString is not null");
}
try
{
if (myString2.equals("test"))
{
//This will never execute
}
}
catch (Exception e)
{
System.out.println("Approach 1: myString2.equals(\"test\") wont work if myString is null");
}
try
{
if ("test".compareTo(myString2) == 0)
{
//This line wont execute
}
}
catch (Exception e)
{
System.out.println("Approach 3: \"test\".compareTo(myString2) wont work if myString is null");
}
try
{
if (myString2.compareTo("test") == 0)
{
//This line wont execute
}
}
catch (Exception e)
{
System.out.println("Approach 4: myString2.compareTo(\"test\") wont work if myString is null");
}
}
}
2条答案
按热度按时间8xiog9wr1#
请参阅下面的代码及其输出,只有方法2可以工作。
原因1和4不起作用,因为在这两种情况下,输入字符串都为空。对于方法3,它要求非空值,请参阅compareto函数的实现。
qaxu7uf22#
1和4可能导致
NPE
自myString
可能为空。数字3也可能抛出一个npe,因为预期的返回是一个整数,也就是小于、大于或等于。如果传递的参数为空,则没有任何依据返回这些参数中的任何一个,因为这会产生误导,并且任何一个参数都会与另一个参数一样好。所以最好的选择是
NPE
.对于数字2,equals测试是一个二进制测试,因此它要么相等,要么不相等。”test”用作equals的引用,因此使用它不会抛出npe。在这种情况下,等于的论点是
myString
. 一个好的equals实现将首先检查参数是否为null,然后再使用它。因此,没有NPE
将被抛出。