web-dev-qa-db-ja.com

バイト配列をdoubleに変換中にjava.nio.BufferUnderflowException

バイト配列をdoubleに変換する必要があります。使っています

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)

ここで何を変更する必要がありますか?

13

ByteBuffer#getDouble() スロー

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

したがって、valueは8バイト未満でなければなりません。 A double は64ビット、8バイトのデータ型です。

15

あなたのコードは次のようなものです:

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

もしそうなら、それはうまくいくはずです。

value配列のデータを表示してください。

oracleから docs

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

これを修正するには、ダブル(8 bytes)を読み取るために、ByteBufferに十分なデータがあることを確認する必要があります。

見てください ここ は、入力データと出力で必要なものを示す簡単なコードです。

3
user3145373 ツ