字符串方法中空场景的最佳说明
Best instructions for null scenario in String approach
我想听听关于这个话题的意见和争论,我还没有决定。
equals 方法是获取值的最佳方法 equality/testing?
if ("text".equals(testString))
1 和 4 可能导致 NPE
,因为 myString
可能为空。
3 号也可能抛出 NPE,因为预期的 return 是一个整数,意思是小于、大于或等于。如果传递的参数为 null,则 return 中的任何一个都没有依据,因为它会产生误导,并且任何一个都和另一个一样好。所以最好的选择是抛出一个 NPE
.
对于数字 2,相等测试是二元测试,因此它要么相等,要么不相等。
“test”用作对 equals 的引用,因此使用它不会抛出 NPE。在这种情况下,equals 的参数是 myString
。一个好的 equals 实现会在使用之前首先检查参数是否为 null。因此,不会抛出 NPE
。
请查看下面的代码及其输出,只有方法 2 有效。
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");
}
}
}
原因 1 和 4 不起作用,因为在这两种情况下输入字符串都是 null 。
对于方法 3,需要 Not Null 值,请参阅 compareTo 函数的实现。
public int compareTo(String anotherString) {
int len1 = value.length;
int len2 = anotherString.value.length;
int lim = Math.min(len1, len2);
char v1[] = value;
char v2[] = anotherString.value;
int k = 0;
while (k < lim) {
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2) {
return c1 - c2;
}
k++;
}
return len1 - len2;
}
我想听听关于这个话题的意见和争论,我还没有决定。
equals 方法是获取值的最佳方法 equality/testing?
if ("text".equals(testString))
1 和 4 可能导致 NPE
,因为 myString
可能为空。
3 号也可能抛出 NPE,因为预期的 return 是一个整数,意思是小于、大于或等于。如果传递的参数为 null,则 return 中的任何一个都没有依据,因为它会产生误导,并且任何一个都和另一个一样好。所以最好的选择是抛出一个 NPE
.
对于数字 2,相等测试是二元测试,因此它要么相等,要么不相等。
“test”用作对 equals 的引用,因此使用它不会抛出 NPE。在这种情况下,equals 的参数是 myString
。一个好的 equals 实现会在使用之前首先检查参数是否为 null。因此,不会抛出 NPE
。
请查看下面的代码及其输出,只有方法 2 有效。
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");
}
}
}
原因 1 和 4 不起作用,因为在这两种情况下输入字符串都是 null 。 对于方法 3,需要 Not Null 值,请参阅 compareTo 函数的实现。
public int compareTo(String anotherString) {
int len1 = value.length;
int len2 = anotherString.value.length;
int lim = Math.min(len1, len2);
char v1[] = value;
char v2[] = anotherString.value;
int k = 0;
while (k < lim) {
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2) {
return c1 - c2;
}
k++;
}
return len1 - len2;
}