0

Eclipse 内で Android プロジェクト用の頂点クラスを作成していますが、コンストラクター内でランタイム バグが発生しています。これがコンストラクタです...

public Vertices(GLGraphics glGraphics, int maxVertices, int maxIndices, boolean hasColor, boolean hasTexCoords)
{
    this.glGraphics = glGraphics;
    this.hasColor = hasColor;
    this.hasTexCoords = hasTexCoords;
    this.vertexSize = (2 + (hasColor?4:0) + (hasTexCoords?2:0)) * 4;

    ByteBuffer buffer = ByteBuffer.allocateDirect(maxVertices * vertexSize);
    buffer.order(ByteOrder.nativeOrder());
    vertices = buffer.asFloatBuffer();

    if(maxIndices > 0)
    {
        buffer = ByteBuffer.allocateDirect(maxIndices * Short.SIZE / 8);
        buffer.order(ByteOrder.nativeOrder());
        indices = buffer.asShortBuffer();
    }
    else
    {
        indices = null;
    }
}

この声明では:

this.vertexSize = (2 + (hasColor?4:0) + (hasTexCoords?2:0)) * 4;

頂点のサイズをバイト単位で計算しています。問題は、三項演算が評価されるたびに vertexSize が 0 のままになり、プログラムがそのステートメントでコンストラクターから抜け出すことです。三項演算子は、条件が true か false かに応じて値を評価していません。ここで何が起こっているのですか?

4

2 に答える 2

1

NullPointerExceptionが発生しています。三項演算子の最初のオペランドを。にすることはできませんnull

この行を実行するときhasColorは、nullとして入力する必要があります。これにより、プログラムで実行時エラーが発生します。これにより、プログラムが終了し、vertexSize割り当てられることはありません。

this.vertexSize = (2 + (hasColor?4:0) + (hasTexCoords?2:0)) * 4;

logcatを確認してください。これが当てはまることが示されているはずです。

編集

@jahroyが述べたように、この行でNPEをスローしますが、コンストラクターに渡されたときに実際にNPEをスローする可能性があります。ブール値にキャストしようとするnullと、NPEも取得します。

于 2012-07-31T19:07:28.623 に答える
0

問題の一部は、1 行のコードで多くのことを実行しようとしていることにあります。断ることを強く勧めます

this.vertexSize = (2 + (hasColor?4:0) + (hasTexCoords?2:0)) * 4;

約 3 行のコードに:

int colorWeight = hasColor ? 4 : 0;
int texCoordWeight = hasTexCoords ? 2 : 0;

this vertexSize = (2 + colorWeight + texCoordWeight) * 4

これがどれほど読みやすいかに注目してください。また、エラー メッセージが表示された場合、原因を突き止めるのがはるかに簡単になります。

于 2012-07-31T19:12:27.067 に答える