java.nio.BufferUnderflowException 将字节数组转换为双精度

Posted

技术标签:

【中文标题】java.nio.BufferUnderflowException 将字节数组转换为双精度【英文标题】:java.nio.BufferUnderflowException while converting byte array to double 【发布时间】:2014-11-02 09:54:17 【问题描述】:

我需要将一个字节数组转换为双精度。我正在使用

double dvalue = ByteBuffer.wrap(value).getDouble();

但在运行时我得到 BufferUnderflowException 异常

Exception in thread "main" java.nio.BufferUnderflowException
    at java.nio.Buffer.nextGetIndex(Buffer.java:498)
    at java.nio.HeapByteBuffer.getDouble(HeapByteBuffer.java:508)
    at Myclass.main(Myclass.java:39)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.hadoop.util.RunJar.main(RunJar.java:212)

我需要在这里更改什么?

【问题讨论】:

你能告诉我们价值声明吗?用一些代码。 【参考方案1】:

ByteBuffer#getDouble() 抛出

 BufferUnderflowException - If there are fewer than eight bytes remaining in this buffer

所以value 必须包含少于 8 个字节。 double 是 64 位、8 字节的数据类型。

【讨论】:

【参考方案2】:

你的代码是这样的:

byte [] value =  // values ;
double dvalue = ByteBuffer.wrap(value).getDouble();

如果是,那么它应该可以工作。

并向我们展示您的 value 数组数据。

来自神谕docs:

Throws: BufferUnderflowException - If there are fewer than eight bytes remaining in this buffer

为了修复它,您需要确保ByteBuffer 中有足够的数据以读取双精度(8 bytes)

看看Here 是一个简单的代码,可以显示您想要的输入数据和输出。

【讨论】:

我正在从 HBase 表中获取行 byte [] row1 = Bytes.toBytes(rowid);获取 g = new Get(row1);结果 result = table.get(g); byte[] value = result.getValue(Bytes.toBytes("columnfamily"), Bytes.toBytes("columnname"));但是当打印 System.out.print(value.length);我得到 4

以上是关于java.nio.BufferUnderflowException 将字节数组转换为双精度的主要内容,如果未能解决你的问题,请参考以下文章