2017-08-07 51 views
-2

以下代码是否可以在任何情况下抛出NullPointerException?任何空指针异常的机会?

比方说我们有功能myClass类的testFunction,声明一个变量并返回它没有先对其进行初始化:

public static String testFunction() 
{ 
    String s1 
    return s1 
} 

,然后我们有下面的代码返回值进行比较的字符串:

String myString = myClass.testFunction(); 

if(myString == "test") 
{ 
system.out.println("Print A") 
} 
else 
{ 
system.out.println("Print B") 
} 

我认为这将总是打印“打印B”,除非函数实际返回的“测试”,然后将打印“打印A”。这是正确的吗?

+1

在java中有一些';'在每个命令的末尾...... – azro

+0

@pzaenger在这种情况下它肯定会抛出一个NPE ...... –

+3

你可以安全地尝试它,既不java也不会破坏计算机。 –

回答

2

不,如你所写,它不能产生NPE(出于多种原因)。

public static String testFunction() 
{ 
    String s1; 
    return s1; 
} 

这将导致编译器错误,因为s1尚未初始化。我在您的代码示例中添加了分号以使其在语法上有效。

if(myString == "test") 

这不会产生NPE。但是,它并不是比较字符串是否平等的正确方法。查看两个字符串对象是否是相同字符序列的正确方法是firstString.equals(secondString),如果firstString为空,则可以生成NPE。

当比较字面来,可能是空的变量的字符串,一个常见的成语是把字符串字面第一,因为它是一种已知的非空的对象,像这样:

"test".equals(myString); 

这将从不生产NPE。

+0

感谢您和所有参与答案的人,并感谢您提供非常详细的答案。 – Jones5672

+0

此外,一方面的问题,只是为了我自己的知识。在上面的例子中,如果(myString ==“test”),即使myString为null,它仍然不会导致空指针异常? – Jones5672

+0

是的,这是正确的。与对象一起使用的'=='操作符比较对象的质量,或多或少的意思,“这些都是指向同一对象的指针吗?”这是平等和相同的区别。如果我有一只黄色橡皮鸭,并且你有相同型号的黄色橡皮鸭,我们的鸭子就相当于('myDuck.equals(yourDuck)'),但它们不一样('myDuck!= yourDuck')。 –