3

ここにあるstackoverflowの他の投稿ですでに説明されているように、EOFExceptionは、ストリームの終わりに予期せず到達したときに発生します。バイト配列を長い数値に変換するメソッドがあります。このバイト配列は、CのデータベースからJavaバインディングを介して取得したuint64_t番号です。uint64_tと長い数値(符号付きビット)へのキャストの問題を知っています。

これが私の方法です:

    public long castByteArrayToLong(byte[] bb){
    ByteArrayInputStream stream = new ByteArrayInputStream(bb);
    DataInputStream di = new DataInputStream(stream);
    long number=-2;
    try {
        number = di.readLong();
    } catch (Exception e) {
        e.printStackTrace();
    }

    return number;
}

このメソッドは時々(!)この例外をスローします:

java.io.EOFException
at java.io.DataInputStream.readFully(DataInputStream.java:180)
at java.io.DataInputStream.readLong(DataInputStream.java:399)
at TreeManager.castByteArrayToLong(TreeManager.java:191)
at TreeManager.test2(TreeManager.java:442)
at TreeManager.main(TreeManager.java:72)

私が理解していないのは、なぜその例外を取得できるのかということです。バイト配列の長さを自分で指定しませんでしたが、バイト配列をByteArrayInputStreamに渡すだけなので、理論的にはそのような例外は発生しないはずです。

(解決策が明らかにある場合は、私を許してください)

4

2 に答える 2

2

バイト配列が実際に8バイトであり、nullでないかどうかを確認します

于 2010-08-02T13:36:47.843 に答える
2

空の配列、null配列、または8バイト未満の配列は例外を引き起こします。次のコードを試してください

ByteArrayInputStream stream = new ByteArrayInputStream(new byte[]{});
DataInputStream di = new DataInputStream(stream);
long number=-2;
try {
   number = di.readLong();
} catch (Exception e) {
   e.printStackTrace();
}
于 2010-08-02T13:40:12.243 に答える