首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法将FloatBuffer转换为float[] (UnsupportedOperationException)

无法将FloatBuffer转换为float[] (UnsupportedOperationException)
EN

Stack Overflow用户
提问于 2020-09-09 17:30:34
回答 2查看 255关注 0票数 0

实际上,我正在编写一个立方体网格,在这个超级方法中,我需要传递多维数据集顶点,这是一个float[],但是我想以一种“对人类友好的方式”来实现,所以我已经这样做了:

代码语言:javascript
复制
private static FloatBuffer vertices = MemoryUtil.memAllocFloat(72);
private static final float[] A={0,0,0},B={0,1,0},C={1,1,0},D={1,0,0},E={0,0,0},F={0,1,0},G={1,1,0},H={1,0,0}; //Vertices

public class MyClass extends MyMeshClass
{
    public MyClass()
    {
       super(
                vertices
                //Front
                .put(A).put(B).put(C).put(D)
                //Back
                .put(E).put(F).put(G).put(H)
                //Right
                .put(D).put(C).put(G).put(H)
                //Left
                .put(A).put(B).put(F).put(E)
                //Top
                .put(B).put(F).put(G).put(C)
                //Bottom
                .put(A).put(E).put(H).put(D).array(),
                Doing other cool stuff here);
    }
}

但是,在转换为数组时,我最终得到了一个UnsupportedOperationException,所以我尝试通过将FloatBuffer转换成这样的数组,进行了不同的尝试

代码语言:javascript
复制
public static float[] toArray(FloatBuffer buffer)
    {
        float[] array = new float[buffer.limit()];
        buffer.get(array);
        return array;
    }

但是我在get (数组)上得到了一个BufferUnderflowException。

有人知道为什么它不起作用吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-09 18:06:21

根据javadoc for Buffer.array(),如果缓冲区没有可访问数组- https://docs.oracle.com/javase/8/docs/api/java/nio/Buffer.html#array--支持,UnsupportedOperationException将被抛出。

这种情况会发生,即当缓冲区使用不是在JVM堆中分配的数组,而是在本机内存中分配的数组时。由于LWJGL的MemoryUtil.memAllocFloat是为opengl优化的,因此我认为它利用了本地内存,因此在这种缓冲区上调用的array()方法失败了。

如果要在堆中分配缓冲区,只需使用:

代码语言:javascript
复制
        FloatBuffer vertices = FloatBuffer.allocate(72);

代码语言:javascript
复制
        FloatBuffer vertices = FloatBuffer.wrap(new float[72]);
``
票数 1
EN

Stack Overflow用户

发布于 2020-09-09 18:00:22

你试过像这样吗?

代码语言:javascript
复制
FloatBuffer buf = FloatBuffer.allocate(10);
buf.put(1f).put(2f).put(3f).put(new float[]{4,5,6});
System.out.println(Arrays.toString(buf.array()));

打印

代码语言:javascript
复制
[1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 0.0, 0.0, 0.0, 0.0]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63816698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档