Является ли это ошибкой "один за другим" в Java 7? - программирование

Является ли это ошибкой "один за другим" в Java 7?

Я не знаю, где искать пояснения и подтверждения в документации Java API и Java-коде, поэтому я делаю это здесь.

В документации API для FileChannel я обнаруживаю ошибки "один за другим" w.r.t. для файла position и файла size в большем количестве мест, чем один.

Вот только один пример. Документация API для transferFrom(...) гласит:

"Если заданная позиция больше, текущий текущий размер, тогда никакие байты не передаются."

Я подтвердил, что код OpenJDK тоже содержит этот код...

public long transferFrom(ReadableByteChannel src, long position, long count)
    throws IOException
{
    // ...
    if (position > size())
        return 0;
    // ...
}

... в файле FileChannelImpl.java в соответствии с документацией.

Теперь, хотя приведенный выше фрагмент кода и документация API выглядят взаимно согласованными, я чувствую, что выше должно быть 'больше или равно', а не просто 'больше, чем ', потому что position является индексом, основанным на 0, в данных файла, при чтении в position == size() не будет данных для возврата к вызывающему абоненту! (В position == size() - 1 не менее 1 байт - последний байт файла - может быть возвращен вызывающему абоненту.)

Вот несколько других подобных примеров на одной странице документации API:

  • position(...): "Установив позицию в значение больше, текущий размер файла является законным, но делает не изменяйте размер файла." (Должно быть "больше или равно" .)

  • transferTo(...): "Если заданная позиция больше, текущий размер файла не передается, то никакие байты не передаются". (Должно быть "больше или равно" .)

  • read(...): "Если заданная позиция больше, текущий размер файла, то никакие байты не читаются". (Должно быть "больше или равно" .)

Наконец, раздел документации для возвращаемого значения read(...) не может оставаться даже самосогласованным с остальной частью документации. Вот что он говорит:

read(...)

Возврат:

Число прочитанных байтов, возможно, ноль или -1, если заданная позиция больше или равна размер текущего файла

Итак, в этом одиночном случае я вижу, что они упоминают правильную вещь.

В целом я не знаю, что из этого сделать. Если я напишу свой код сегодня, соответствующий этой документации, тогда исправление в будущем ошибки в Java (код или документация) сделает мой код ошибкой, требуя исправления и с моей стороны. Если я сам положу себя сегодня с вещами, которые стоят сегодня, тогда мой код станет багги для начала!

4b9b3361

Ответ 1

Это может быть немного яснее в javadoc и теперь отслеживается здесь:

https://bugs.openjdk.java.net/browse/JDK-8029370

Обратите внимание, что пояснение javadoc не должно ничего менять для реализаций FileChannel (например, методы переноса возвращают количество переданных байтов, так что это 0, когда позиция имеет размер или размер).

Ответ 2

Это не ошибка, связанная с ошибкой в ​​том, что проблема с поведением не решена правильно? В лучшем случае проблема doc. Документы не ошибаются, возможно, просто не завершены.

Однако я не уверен, что они чего-то не хватает. position == size() не является исключительной ситуацией. Это ситуация, когда 0 байтов можно прочитать по определению. position > size() является исключительным: может быть прочитано менее 0 байтов. Ему нужна записка. Вызывается ли исключение? Или ничего. read() отличается тем, что он должен возвращать байт, поэтому чтение 0 является исключительным условием.

Я лично считаю, что тот факт, что вы просите, означает, что документы могут быть более явными. Также непонятно, почему этот метод не выполняет короткое замыкание, а не пытается передать 0 байтов. Но похоже на возможную логику.

(Или вы имеете в виду, что что-то не документировано?)