-1

我使用 Eclipse 自动工具为 person 对象实现 equals 方法。如果两个人反对,p1并且p2null,应该p1.equals(p2)返回什么?当前实现提供了我的 Eclipse 返回True。但是,我尝试与null字符串对象进行比较,它抛出NullPointerException.Here is the code。另外我想知道为什么不同运行的代码会给出不同的结果。我粘贴了下面的输出

class Parent2 {
private String name;
private int id;
public static int count = 0;

public Parent2(String name, int id) {
    this.name = name;
    this.id = id;
    if (this.getClass() == Parent2.class)
        count++;
}

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + id;
    result = prime * result + ((name == null) ? 0 : name.hashCode());
    return result;
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Parent2 other = (Parent2) obj;
    if (id != other.id)
        return false;
    if (name == null) {
        if (other.name != null) {
            System.out.println("here2");
            return false;
        }
    } else if (!name.equals(other.name)) {
        System.out.println("here");
        return false;
    }
    return true;


}

}

public class App {
    public static void main(String[] args) {
        Parent2 par = new Parent2("aa", 5);
        Parent2 par2 = new Parent2(null, 5);
        Parent2 par3 = new Parent2(null, 5);

    System.out.println(par.equals(par2));
    System.out.println(par2.equals(par));
    System.out.println(par3.equals(par2));

    System.out.println("----------------------------------------");

    String str = null;
    String str2 = null;

    System.out.println(str.equals(str2));
    System.out.println(str + "; " + str2);
}

}

每次执行的输出都不同,这里有一些:

here
false
here2Exception in thread "main" java.lang.NullPointerException
    at RoundTwo.App.main(App.java:64)

false
true
----------------------------------------

输出2:

here
Exception in thread "main" java.lang.NullPointerException
    at RoundTwo.App.main(App.java:64)
false
here2
false
true
----------------------------------------

输出3:

here
false
here2
false
true
Exception in thread "main" java.lang.NullPointerException
    at RoundTwo.App.main(App.java:64)
----------------------------------------

输出4:

here
falseException in thread "main" java.lang.NullPointerException
    at RoundTwo.App.main(App.java:64)

here2
false
true
----------------------------------------

输出5:

here
false
here2
false
true
----------------------------------------
Exception in thread "main" java.lang.NullPointerException
    at RoundTwo.App.main(App.java:64)

只有最后一个输出,执行string equals抛出的代码部分NullpointerException

感谢您的帮助

4

5 回答 5

4

一般来说:如果控制流已经在实例方法中,则调用该方法的实例不为空。

因此,在您的equals方法内部,两个对象都不能null,因为控制流已经在实例方法内部。参考this永远不可能null。_ (在静态上下文中,它不可用,使用它会导致编译器错误)

但是,您的直接问题是,如果要对其执行相等性检查的对象为 null,则执行甚至不会进入您的equals方法- 您不能在null对象上调用实例方法:您会得到一个NullPointerException.

其他涉及空值的案例

然而,一个Comparator实例应该处理这种情况:在这种情况下,它应该返回0

控制台输出的奇怪行为

控制台上消息的顺序不同,因为您写入两个不同的流:System.errSystem.out. 在这种情况下,不能保证打印消息的顺序与它们写入的顺序相同......

于 2013-10-07T19:34:22.763 回答
3

正如其他人所说,对null变量执行任何操作都会引发NullPointerException. 我想这是您问题中的主要问题:

只有最后一个输出,执行字符串等于抛出的代码的一部分NullpointerException

这是错误的。您在每次执行时看到不同的输出的事实是因为System.out.println()在 PrintStream 上写入,System.outRuntimeExceptions,如NullPointerException,在 PrintStream 中写入System.err。两个流都在同一个控制台上结束写入,但不能保证它们刷新内容的时间。如果您想查看其行为方式,请使用单个缓冲区来打印所有内容,包括异常,例如使用记录器而不是普通System.out调用。一个基本样本是:

public class App {
    public static void main(String[] args) {

    try {
        Parent2 par = new Parent2("aa", 5);
        Parent2 par2 = new Parent2(null, 5);
        Parent2 par3 = new Parent2(null, 5);

    System.out.println(par.equals(par2));
    System.out.println(par2.equals(par));
    System.out.println(par3.equals(par2));

    System.out.println("----------------------------------------");

    String str = null;
    String str2 = null;

    System.out.println(str.equals(str2));
    System.out.println(str + "; " + str2);
    } catch (Exception e) {
        //this will do the "trick"
        e.printStacktrace(System.out);
    }
    }
}

现在,在您的应用程序的每次执行中,您都会得到一个结果:

here
false
here2
false
true
----------------------------------------
Exception in thread "main" java.lang.NullPointerException
    at RoundTwo.App.main(App.java:64)

但是,我尝试与空字符串对象进行比较,它会抛出 NullPointerException。

对你的p1p2对象做同样的事情,你会看到NullPointerException出现。从上面的代码:

public class App {
    public static void main(String[] args) {

    try {
        Parent2 par = new Parent2("aa", 5);
        Parent2 par2 = new Parent2(null, 5);
        Parent2 par3 = new Parent2(null, 5);
    par = null;
    par2 = null;
    System.out.println(par.equals(par2)); // <-- NPE here
    System.out.println(par2.equals(par));
    System.out.println(par3.equals(par2));

    System.out.println("----------------------------------------");

    String str = null;
    String str2 = null;

    System.out.println(str.equals(str2));
    System.out.println(str + "; " + str2);
    } catch (Exception e) {
        //this will do the "trick"
        e.printStacktrace(System.out);
    }
    }
}
于 2013-10-07T19:47:00.243 回答
3

如果 P1 和 P2 都为 null 它应该返回NullPointerException,因为您不能在 a 上调​​用 equals 方法NULL

于 2013-10-07T19:35:19.817 回答
1

如果两个 person 对象 p1 和 p2 为空,p1.equals(p2) 应该返回什么?

它导致一个NullPointerException

于 2013-10-07T19:36:13.960 回答
1

您不需要在方法中考虑这种情况。Ifthis是自动nullNullPointerException,并且无法覆盖此行为。

通过方法重载,将调用的确切方法o1.equals(o2)取决于. 由于没有运行时类型(没有对象),因此没有可以调用的方法。因此它总是会抛出.o1nullNullPointerException

于 2013-10-07T19:35:45.790 回答