字符串方法中空场景的最佳说明

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;
    }