Чтобы использовать методы и член объекта, вам сначала нужно создать этот объект. Если вы его не создали (переменная, которая должна содержать объект, не инициализируется), но вы пытаетесь использовать его методы или переменные, вы получите эту ошибку.
Иногда вы можете просто забыть инициализировать .
Отредактировано: new не может вернуть значение null, но исключение огня при ошибке. Давно это было на некоторых языках, но не больше. Спасибо @John Saunders за указание на это.
Я бы этого не сделал, я бы оставил его на самом высоком уровне абстракции. Если вы не собираетесь использовать возможности BufferStream для меток и сброса, зачем их обертывать?
Если потребитель нуждается в нем, лучше его обернуть.
Возможно, вам не всегда нужна буферизация, поэтому ответ будет «Нет», в некоторых случаях это просто накладные расходы.
Есть еще одна причина: «Нет», и это может быть более серьезным. BufferedInputStream
(или BufferedReader
) может привести к непредсказуемым сбоям при использовании с сетевым сокетом, когда вы также включили тайм-аут в сокете. Тайм-аут может возникать при чтении пакета. Вы больше не сможете получить доступ к данным, которые были перенесены в эту точку, даже если вы знали, что существует некоторое ненулевое количество байтов (см. java.net.SocketTimeoutException
, который является подклассом java.io.InterruptedIOException
, поэтому имеет переменную bytesTransferred
доступно.)
Если вам интересно, как может произойти тайм-аут сокета во время чтения, просто подумайте о вызове метода read(bytes[])
и исходного пакета, который содержит сообщение, в результате которого был разделен, но один из частичных пакетов задерживается за пределами таймаута (или оставшейся части таймаута). Это может произойти чаще, когда снова завертывается в то, что реализует java.io.DataInput
(любое из чтений для нескольких байтовых значений, например readLong()
или readFully()
или BufferedReader.readLine()
.
Обратите внимание, что java.io.DataInputStream
также является плохим кандидатом для потоков сокетов, у которых есть тайм-аут, так как он не ведет себя хорошо с исключениями тайм-аута.
bytesTransferred
отличен от нуля. До тех пор я не могу доказать это так или иначе. [Я потерял данные с DataInputStream и таймаутом.]
– Kevin Brock
4 June 2010 в 12:18
bytesTransferred
никогда не будет отличным от нуля (иначе BufferredInputStream завершится с ошибкой). Это может быть также случай, когда реализация JVM на разных платформах / поставщиках может давать разные результаты - я только что тестировал в Windows 7 с помощью Sun / Oracle Java.
– Kevin Brock
4 June 2010 в 12:34
Это также зависит от того, как вы собираетесь читать из InputStream. Если вы собираетесь читать его символ / байт за раз (т. Е. Read ()), то BufferedInputStream уменьшит ваши накладные расходы, пошаговое выполнение массового чтения от вашего имени. Если вы собираетесь читать его в массив 4k или 8k byte / char, блок за раз тогда BuffredInputStream, вероятно, вам не пригодится.
Имеет ли смысл always переносить InputStream как BufferedInputStream, когда я знаю, является ли данный InputStream чем-то иным, чем буферизированным?
blockquote>Нет .
Имеет смысл, если вы, вероятно, будете выполнять множество небольших чтений (один байт или несколько байтов за раз), или если вы хотите использовать некоторые функции более высокого уровня, предлагаемые буферизованными API ; например,
BufferedReader.readLine()
.Однако, если вы собираетесь выполнять большие чтения блоков с использованием методов
read(byte[])
и / илиread(byte[], int, int)
, обертываниеInputStream
вBufferedInputStream
не помогает.(В ответ на комментарий @Peter Tillman по его собственному ответу, блок чтения прецедентов определенно представляет более 0,1% использования классов
InputStream
!! Однако он прав в том смысле, что обычно безвреден использовать буферный API, когда вам это не нужно.)
BufferedInputStream
добавляет к простойInputStream
. Это может быть справедливо с точки зрения API, но, как говорили другие,BufferedInputStream
заботится о буферизации чтения для вас. Чтение байта по времени от гологоFileInputStream
в 40 раз медленнее, чем чтение из одного, завернутого вBufferedInputStream
. Тем не менее, вернитеInputStream
и сохраните подпись своего метода как таковой. Пользователи могут обернуть, если они того пожелают. – jasonmp85 3 June 2010 в 09:06