EOFException в моем коде Java - PullRequest
       7

EOFException в моем коде Java

3 голосов
/ 02 августа 2010

Как уже объяснялось в других публикациях здесь в stackoverflow, EOFException возникает, когда конец потока неожиданно достигнут. У меня есть метод, который преобразует массив байтов в длинное число. Этот байтовый массив является номером uint64_t, который я извлек по связыванию java из базы данных в C. Я знаю проблемы с 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, поэтому я думаю, что теоретически я не должен получать такое исключение.

(Пожалуйста, прости меня, если решение очевидно)

Ответы [ 2 ]

2 голосов
/ 02 августа 2010

Пустой массив, 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();
}
2 голосов
/ 02 августа 2010

проверить байтовый массив, если он действительно имеет 8 байтов и не равен нулю

...