java - 缓冲区下溢?

标签 java android bufferunderflowexception

我有以下代码 fragment 。标记的行导致 BufferUnderflowException。我阅读了有关异常的文档,但仍然不明白它的含义究竟。我使用 .rewind() 方法,我印象中它可以缓解这个问题。

谁能告诉我错误的主题或原因?

            Bitmap cameraBaseSized = BitmapFactory.decodeFile(cameraPath, opts);
            Bitmap canvasBlendSized = BitmapFactory.decodeFile(canvasPath, options);
            Bitmap result = cameraBaseSized.copy(Config.ARGB_8888, true);
            IntBuffer buffBase = IntBuffer.allocate(cameraBaseSized.getWidth()
                    * cameraBaseSized.getHeight());
            cameraBaseSized.copyPixelsToBuffer(buffBase);
            buffBase.rewind();
            IntBuffer buffBlend = IntBuffer.allocate(canvasBlendSized.getWidth()
                    * canvasBlendSized.getHeight());
            canvasBlendSized.copyPixelsToBuffer(buffBlend);
            buffBlend.rewind();
            IntBuffer buffOut = IntBuffer.allocate(cameraBaseSized.getWidth()
                    * cameraBaseSized.getHeight());
            buffOut.rewind();
            while (buffOut.position() < buffOut.limit()) {
                int filterInt = buffBlend.get(); //BUFFERUNDERFLOW EXCEPTION
                int srcInt = buffBase.get();
                int redValueFilter = Color.red(filterInt);
                int greenValueFilter = Color.green(filterInt);
                int blueValueFilter = Color.blue(filterInt);
                int redValueSrc = Color.red(srcInt);
                int greenValueSrc = Color.green(srcInt);
                int blueValueSrc = Color.blue(srcInt);
                int redValueFinal = multiply(redValueFilter, redValueSrc);
                int greenValueFinal = multiply(greenValueFilter, greenValueSrc);
                int blueValueFinal = multiply(blueValueFilter, blueValueSrc);
                int pixel = Color.argb(255, redValueFinal, greenValueFinal, blueValueFinal);
                buffOut.put(pixel);
            }
            buffOut.rewind();
            result.copyPixelsFromBuffer(buffOut);

异常 fragment

11-29 14:41:57.347: E/AndroidRuntime(2166): Caused by: java.nio.BufferUnderflowException
11-29 14:41:57.347: E/AndroidRuntime(2166):     at java.nio.IntArrayBuffer.get(IntArrayBuffer.java:55)

我还想补充一点,这只发生在特定设备上,尤其是三星机型。

最佳答案

也许这个测试会有所帮助:

    ByteBuffer b = ByteBuffer.allocate(1);
    b.get();
    b.get();

分配后缓冲区中有 1 个字节,第一个 get() 读取这个字节并且缓冲区达到其限制,第二个 get() 是非法的,没有任何内容可读,所以你得到 BufferUnderflowException。

此代码不会失败:

    ByteBuffer b = ByteBuffer.allocate(1);
    b.get();
               b.rewind();
    b.get();

你读取了这个字节,但是它还在缓冲区中,所以你可以倒带它并再次读取这个字节

关于java - 缓冲区下溢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13633522/

相关文章:

java - onActivityResult 之后值被设置为 null

android - Cordova 初始屏幕无法在 Android 或 iOS 中加载

scala - 为什么我在这个 Scala 中得到一个 java.nio.BufferUnderflowException

java - 如何测量 i7 上的 java 性能?

JavaFx 时间轴 - 设置初始延迟

android - osmBonusPack 的示例代码

java - 如何在 Java/Android 中重用内部类?

java - 如何升级 javax.naming.* 和 javax.xml.* 导入以与 java 10 兼容

java - Java的BufferunderflowException