关于空指针异常

时间:2010-11-27 03:26:04

标签: java nullpointerexception

您好 我写了这样的代码,但它会返回此异常。我不知道为什么请帮助我谢谢。

         private void Scan(DoublyLinkedList dList) { // T(n) = O(n)
    DNode p1 = dList.getFirst();


    while (p1!=null) {


        DNode p2 = p1.next;
         System.out.println(p1.getElement().toString()+"lol");
        if (p2.next!=null) {

         DNode p3 = p2.next;

            if(p3.getElement()!=null){

                boolean b = Determinate.isPointRightSide(p1.getElement(), p2.getElement(),p3.getElement());

                if (b == true) {
                    p1 = p1.next;
                } else {
                    p1.next = p3;
                    p3.prev = p1;
                    dList.remove(p2);
                    p1 = p1.prev;
                }


            }
            else break;


    }else break;}

}

    public static double determinate(Object get, Object get0, Object get1) {

    double data[][] = new double[3][2];

    data[0][0] = ((Point) get).getX();
    data[0][1] = ((Point) get).getY();
    data[1][0] = ((Point) get0).getX();
    data[1][1] = ((Point) get0).getY();
    **data[2][0] = ((Point) get1).getX();**
    data[2][1] = ((Point) get1).getY();


    return ((data[0][0] * (data[1][1] - data[2][1])) - (data[1][0] * (data[0][1] - data[2][1])) + (data[2][0] * (data[0][1] - data[1][1])));
}

异常:

run:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at ConvexHull.Determinate.determinate(Determinate.java:55)
        at ConvexHull.Determinate.isPointRightSide(Determinate.java:15)
        at ConvexHull.GrahamVersion.Scan(GrahamVersion.java:104)
        at ConvexHull.GrahamVersion.grahamScan(GrahamVersion.java:83)
        at ConvexHull.GrahamVersion.<init>(GrahamVersion.java:25)
        at UI.MainFrame.grahamButtonActionPerformed(MainFrame.java:221)

这将显示“p3”为空!但我检查“p3”为什么它再次返回“null”? 我使用 strong 来显示引发异常的那些行。

编辑:我编辑了我的帖子,但它会为“p1”

抛出此异常

2 个答案:

答案 0 :(得分:4)

有一件事看起来不对:

if (!p3.equals(null))

这通常总是正确的(如果p3 != null)或抛出NullPointerException(如果p3 == null

测试p3是否为空的正确方法是:

if (p3 != null)

虽然这可能不是你获得NullPointerException的原因

如果在您突出显示的行上发生NullPointerException,则必须是因为get1为null。这是作为p3.getElement()传递的,因此请确定它是否为空。

理论上,如果data[2]为null,则data[2][0]将抛出NullPointerException,但由于您初始化data,因此在这种情况下不会出现问题。

另外,是否有一些理由认为确定()的参数是Object而不是Point?如果这是您的实际代码而不是一些简化的测试用例,那么参数应该都是Point,因为这是他们必须的。

修改
我看到您已更改原始代码,以便在此页面上添加一些建议。

但我仍然看到一些问题:

while (p1!=null) {
    DNode p2 = p1.next;

    if (p2.next!=null) {
//      ^^^^^^^ If p2 is null, then this will throw NullPointerException

     DNode p3 = p2.next;

     if(p3.getElement()!=null){
//      ^^^^^^^^^^^^^^^   If p3 is null, then this will throw NullPointerException


         boolean b = Determinate.isPointRightSide(p1.getElement(), p2.getElement(),p3.getElement());
//                                                ^^^^^^^^^^^^^^^  ^^^^^^^^^^^^^^^ if one of these returns null then isPointRightSide() will throw a NullPointerException

答案 1 :(得分:0)

我很确定你错了,因为:

!p3.equals(null)

无效 - 行(或涉及p1p2的行)会抛出异常。您无法在null上调用任何方法,包括equals()。将其用于所有null次检查:

p3 != null