2016-03-26 26 views
2

をスローし、ここで説明するように、私は、2つのfloatの配列をとるコンストラクタを使用して線を作るしようとしています:http://slick.ninjacave.com/javadoc/org/newdawn/slick/geom/Line.htmlジャワSlick2Dラインコンストラクタは、Java Slick2DでNullPointerExceptionが

私のコードは以下の通りです:

float[] floatArray1 = { 10.0f, 155.0f }; 
float[] floatArray2 = { 20.0f, 165.0f }; 
Line line1 = new Line (floatArray1, floatArray2); 

java.lang.NullPointerException 
    at org.newdawn.slick.geom.Line.set(Line.java:217) 
    at org.newdawn.slick.geom.Line.set(Line.java:138) 
    at org.newdawn.slick.geom.Line.<init>(Line.java:112) 
    at view.play.Character.checkIntersectionMovementVector(Character.java:263) (my method) 

ですが、なぜでしょう:

しかし、この三行目(私のコードの行263)は、NullPointerExceptionがスローされますか?

編集:それは4つのfloat値の代わりに、長さ2つの作品の2つのfloatの配列を取るコンストラクタを使用していることは注目に値する、と例外をスローしません:

 Line line = new Line (10.0f, 155.0f, 20.0f, 165.0f); 

答えて

2

Lineクラスのバグのように見えます。最終的に呼び出されたLine.set()方法はこれです:

public void set(float sx, float sy, float ex, float ey) { 
    super.pointsDirty = true; 
    start.set(sx, sy);  // this is line 217 
    end.set(ex, ey); 
    float dx = (ex - sx); 
    float dy = (ey - sy); 
    vec.set(dx,dy); 

    lenSquared = (dx * dx) + (dy * dy); 
} 

しかし、Lineクラスのstartインスタンス変数は、呼び出すコンストラクタで初期化されていません。

public Line(float[] start, float[] end) { 
    super(); 

    set(start, end); // line 112 
} 

あなたがにバグを報告する必要がありますSlick2dの管理者回避策として、あなたはVector2f入力コンストラクタを使用することができるはずです。ここで使用set()方法として

public Line(Vector2f start, Vector2f end) 

startを初期化しない:

public void set(Vector2f start, Vector2f end) { 
    super.pointsDirty = true; 
    if (this.start == null) { 
     this.start = new Vector2f(); 
    } 
    this.start.set(start); 

    if (this.end == null) { 
     this.end = new Vector2f(); 
    } 
    this.end.set(end); 

    vec = new Vector2f(end); 
    vec.sub(start); 

    lenSquared = vec.lengthSquared(); 
} 

4つのフロート入力コンストラクタはまたので動作します上記のVector2fコンストラクタを呼び出す:

public Line(float x1, float y1, float x2, float y2) { 
    this(new Vector2f(x1, y1), new Vector2f(x2, y2)); 
} 
+0

ブリリアントな回答、tあなたをハンク。どうやったらそれをどうやって解決できるか、私は彼らに知らせることに目を向けます。 –

+0

@AlexW upvoteのメリットがない素晴らしい答え? Jeez、厳しい群衆。 – elhefe

+0

私はupvoteに十分な評判を満たしていない、私は(または少なくとも)10評判とupvote 15が必要です。それ以外の場合、私は確かにあなたにupvoteを与えるだろう。私はちょうどの場合にしようとしました、そして、うそは拒絶されました。このように、私は最高の答えを刻み、私の明確な感謝は十分であると思った。 –

関連する問題