您好 我写了这样的代码,但它会返回此异常。我不知道为什么请帮助我谢谢。
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”抛出此异常答案 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)
无效 - 行(或涉及p1
或p2
的行)会抛出异常。您无法在null
上调用任何方法,包括equals()
。将其用于所有null
次检查:
p3 != null