4

对不起,如果我的问题是愚蠢的,那没关系。但我只想知道在这两种情况下会发生什么。

public class Test {
    public static void main(String[] args) 
    {
        String str="test";
        if(str.equals("test")){
            System.out.println("After");
        }
        if("test".equals(str)){
            System.out.println("Before");
        }
    }
}

两者都只给出相同的结果。但我知道有一些原因。我不知道。这两个条件有什么区别?

4

6 回答 6

12

它们之间根本没有区别。许多程序员使用第二种方式只是为了确保他们没有得到NullPointerException. 就这样。

    String str = null;

    if(str.equals("test")) {  // NullPointerException
        System.out.println("After");
    }
    if("test".equals(str)) {  // No Exception will be thrown. Will return false
        System.out.println("Before");
    }
于 2012-10-26T09:16:07.337 回答
2

第二个不扔NullPointerException。但它再次被认为是糟糕的代码,因为它可能会发生str并且nullyou do not detect that bug at this point instead you detect it somewhere else

  1. 给定一个选择1,因为它可以帮助您在早期发现程序中的错误。
  2. 否则添加检查nullif stris nullthen 你将能够确定字符串真的不相等还是第二个字符串不存在

    if(str == null){
    //Add a log that it is null otherwise it will create confusion that 
    // program is running correctly and still equals fails
    }
    if("test".equals(str)){
        System.out.println("Before");
    }
    

对于第一种情况

    if(str.equals("test")){//Generate NullPointerException if str is null
        System.out.println("After");
    }
于 2012-10-26T09:15:58.333 回答
2

其实两者都是一样的。这两者没有区别。http://www.javaworld.com/community/node/1006 Equal 方法比较两个字符串对象的内容。因此,在您的第一种情况下,它将 str 变量与“test”进行比较,然后将“test”与 str 变量进行比较。

于 2012-10-26T09:21:30.377 回答
1

第一个if语句测试,是否str等于"test"。第二个if语句测试,是否"test"等于str。所以这两个 -statement 之间的区别在于,首先你向带有参数的对象if发送消息。然后对象比较,是否等于参数并返回或。第二个语句向 发送消息。也是一个字符串对象。所以现在比较,是否等于和返回或。str"test"strtruefalseif"test""test""test"strtruefalse

于 2012-10-26T09:23:48.947 回答
1

他们做的几乎一样。

唯一的区别是第一个示例使用字符串对象“str”的equal()方法,参数为“test”-string,而第二个示例使用字符串“text”的equal()方法和“str”作为参数。

第二个变体不能抛出 NullPointerException,因为它显然不是 null。

于 2012-10-26T09:45:39.630 回答
0

当您尝试第一次修复静态字符串时,您可以在许多情况下避免空指针异常。

于 2012-10-26T09:16:22.983 回答