我正在为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并且程序在该语句处突破构造函数。三元运算符不会根据条件是真还是假来评估它的值。这是怎么回事?
答案 0 :(得分:1)
您遇到了空指针异常。三元运算符的第一个操作数不能是null
。
当您运行此行时,hasColor
必须以null结尾,导致程序给您一个运行时错误。这将导致您的程序结束,永远不会分配vertexSize
。
this.vertexSize = (2 + (hasColor?4:0) + (hasTexCoords?2:0)) * 4;
检查你的logcat,它应该告诉你是这种情况。
修改强>
正如@jahroy所提到的,虽然它会在这一行抛出一个NPE,但实际上它可能会在传入构造函数时抛出NPE。如果您尝试将null
强制转换为布尔值,您还将获得一个NPE。
答案 1 :(得分:0)
部分问题在于您尝试在一行代码中执行过多操作。我强烈建议你打破
this.vertexSize = (2 + (hasColor?4:0) + (hasTexCoords?2:0)) * 4;
大约三行代码:
int colorWeight = hasColor ? 4 : 0;
int texCoordWeight = hasTexCoords ? 2 : 0;
this vertexSize = (2 + colorWeight + texCoordWeight) * 4
请注意这是多么容易阅读。此外,当您收到错误消息时,更容易找到原因。