在nullpointer异常的情况下,Java vs Objective C.

Rub*_*ban 6 java string null android objective-c

为什么Java经常抛出空指针异常,如果我尝试访问空值而Objective C没有?

Java的:

public class SubscribeEmailActivity {
    String status;

    public static void main(String[] args){

        if(Status.equals(null)||status.equals(""){

            // i am getting error here

        }
     }

}
Run Code Online (Sandbox Code Playgroud)

目标C:

//in .h file
NSString *exp;

//in .m file
if ([exp isEqualToString:NULL] ||[exp isEqualToString:@""])
{
    // i am not getting any error
}
Run Code Online (Sandbox Code Playgroud)

Pet*_* B. 7

问题在于你在java中的评价,它应该是:

if(status == null||status.equals("")) {
    //Do not try to dereference status....
Run Code Online (Sandbox Code Playgroud)

应该注意的是,这只能起作用,因为Java和其他语言允许在逻辑评估中进行捷径.在这种情况下,一些简单的布尔代数:

true || ??? => true
Run Code Online (Sandbox Code Playgroud)

一旦第一项计算结果为真,我们就知道OR条件也将评估为真,没有必要检查第二项.

此外,您可以使用Apache Commons isEmpty()或自己动手:

public static final boolean isEmpty(String arg0) {
    if(arg0 == null) return true;
    if(arg0.trim().length() < 1) return true;
    return false;
}
Run Code Online (Sandbox Code Playgroud)

显示的版本类似于isBlankApache Commons.


小智 6

最终,完全解决此问题的唯一方法是使用不同的编程语言:

  • 在Objective-C中,你可以做相当于在nil上调用方法,绝对不会发生任何事情.这使得大多数空检查变得不必要,但可能使错误更难以诊断.
  • 在Nice是一种Java衍生语言,所有类型都有两个版本:潜在的null版本和非null的版本.您只能在非null类型上调用方法.通过显式检查null,可以将可能为空的类型转换为非null类型.这使得更容易知道哪些空检查是必要的,哪些不是.