Почему NullPointerexception - это исключение времени выполнения и ременнаяException не?

StackOverflow https://stackoverflow.com/questions/2884836

Вопрос

Возможная причина, поскольку nullpointexception представляет собой исключение времени выполнения, заключается в том, что каждый метод может бросить его, поэтому каждый метод должен иметь «броски NullPointerexception», и был бы уродливым. Но это происходит с RemoteException.

И возможную причину, поскольку Remoteexception не является исключением времени выполнения, - это клиенту сообщить об этом клиенту для лечения исключения. Но каждый метод в удаленной среде нужно бросать его, поэтому нет никакой разницы в метании NullPointerException.

Спекуляция? Я был ясно?

Это было полезно?

Решение

Я не буду обсуждать решение, я просто процитирую объяснение решения из Энн Уолрата (который ведет проект и внедрение Java RMI). Это извлечено из этого сообщение Из архивов RMI-пользователей (сообщение от января 1999 г.):

Решение о внесении редакцииxception проверенного исключения и требует удаленных методов для списка исключения в его бросках, не является религиозным. Решение основано на том, как сделать распределенные вычисления надежными. Этот вопрос подходит время от времени в списке наших пользователей. У меня есть подробный ответ, который я опубликовал некоторое время назад. Вот это если вы заинтересованы. Я не мог найти его в архиве RMI-пользователей, поэтому я включил его ниже.

ваше здоровье,

-- Анна


Я хотел бы обратиться к обоснованию для внесения восстановления проверяемого исключения, а не Runtimeexception.

1) сети не надежны

Я хотел бы, чтобы они были, но на самом деле они нет. Каждая сеть имеет переходные сбои. Вы можете строить в избыточном резервию сети, но тот факт, что большинство сетей этого нет. Интранеты имеют переходные сбои, как и в интернете. Таким образом, каждый RPC сделан, подвержен неудаче. Типы сбоев могут не иметь ничего общего с «сетью», как; Если ваш сервер работает из дескрипторов файлов, ваш клиент получит исключение подключения. Это не сбой сети, в смысле сети сломана; Ваш сервер находится в трансмиссионном состоянии, являющихся ресурсом, голоданным.

RMI не предназначен только для обработки лишь ограниченного случая, что вся сетевая сбивает при сбое одной сети. Такая сеть будет считаться надежным, либо все вверх, либо все снизится - нет частичной недостаточности. RMI предназначен для более широкой аудитории.

2) Отказ RPC не может быть скрыт от клиента

Частичная неудача является фактом распределенного программирования; Эти сбои не могут быть скрыты для программы. В клиенте появляется неудача, проверено ли исключение или незаменимое исключение, он все еще отображается. Итак, как такие неудачи должны быть указаны клиенту?

3) проверенные исключения, способные более надежные программы

Было время, когда Дуб и самая ранняя версия Java не проверили исключения. Обработка исключений была консультациями, и это был небезопасный мир там. Это была наша группа (Jim Waldo и ME, в частности :-), которые рекомендуют, чтобы быть исключения, проверенные компилятором. Джим был совершенно убедительным в своих аргументах, рассказывая об этом мире, где царит надежный код. После некоторого рассмотрения Java переиграл, чтобы проверить исключения. Только те исключения, для которых не было никакого восстановления или отражения ошибок приложений, не было бы не отменено (например, OutofMemoryError, NullPointerexception соответственно). И мир снова был в безопасности.

Представьте себе удивление инженеров Java, когда многие исключения в Java API и компилятором были изменены с того, что были изменены с незарегистрированным для проверки, и компилятор принудил различие, они обнаружили ошибки в реализациях! Таким образом, наилучшие усилия при обработке условий ошибок, однако, хорошо намерены, не было достаточно хорошей. Этот компилятор полезен для чего-то :-)

4) RemoteException должен быть проверенным исключением

ОК, так что вернусь на трек здесь. Поскольку Remoteexception - это факт жизни в RPC Call (см. # 1, № 2) и проверенные исключения, заставляющие вас писать безопасный код (№ 3), мы думали, что сделание RemoteException Checked исключение было хорошей идеей. Написание прочных распределенных программ достаточно трудно, не имея компилятора, чтобы помочь вам с исключениями.

Итак, некоторые могут утверждать, что RemoteException - это как нарушитель, что Ваша программа должна превышать мертвую, если удаленный звонок не удается. Я не согласен с этой точкой. Да, в некоторых случаях нет никакого восстановления от восстановления; Но если вы пишете надежную распределенную программу, ваш клиент должен поймать сбои и повторить попытку соответствующим образом. Возможно, вам нужно связаться с другим сервером или прервать транзакцию некоторых. Если RemoteException не обрабатывается, он будет перколировать и сбой клиента (ЮК).

Другие заявили, что существуют некоторые удаленные интерфейсы, которые используются как в локальном корпусе, так и в дистанционном корпусе, и клиенту не должны иметь дело с исключениями в местном случае, поэтому Remoteexception не должен быть в пункте и обработке Это не должно быть обязательным. Теперь, если мы допустили методы удаленного интерфейса, чтобы пропустить редактированиеxception и имел «RMIC» переключатель для создания загрязнений, которые бросают незаменимое восстановление, клиент имеет нетВыбор в этом вопросе. Решение обработки исключений должно оставаться с клиентом. Если вы определяете интерфейс, который бросает только незаметные исключения, вы никогда не можете написать клиенту, который хочет, чтобы компилятор помочь в решении этих исключений. Мы уже видели из приведенного выше приведенного выше примера, которые проверили исключения, которые образуют надежный код.

Еще одна проблема, которая возникла сейчас и снова, заключается в том, что разработчики должны просто переводить локальные интерфейсы и использовать их в качестве удаленных интерфейсов. Это может работать для небольшого набора случаев, но если интерфейс не был разработан с помощью параллелизма и частичной недостаточности и в виду задержку вызова, протокол, полученный интерфейсом, может не соответствовать использованию в распределенном случае. Достаточно ли информация, передаваемая в этих операциях, чтобы сделать операции IdEmpotent? Возможно, но скорее всего нет.

Помещение RemoteException в каждом пункте броска может показаться болью, но ее цена заплатить за написание прочных распределенных приложений.

- Энн Вуллрат

Другие советы

Наблюдается значительно больше потенциала для NullPointerException чем RemoteException. Отказ Любой код, который вызывает метод на объекте (то есть практически любой код Java вообще) может потенциально бросить NullPointerException. Отказ Только код RMI может бросить RemoteException. Отказ Это крошечное подмножество «всех кодов».

При написании библиотек RMI дизайнеры решили сделать код клиента ожидать, что касается этих исключений. Учитывая природу выполнения удаленного кода, я думаю, что это разумно.

То, как я понимаю это:

  • Runtimeexceptions брошены для вещей, которые были предотвращены.
  • Исключения брошены для вещей, которые были непроветываемыми, но восстанавливаемыми
  • Ошибки брошены для вещей, которые были непроветываемыми и невосприимчивыми.

Например, NullPointerexceptions всегда можно избежать и поэтому не проверяют исключения. Возможность возникновения может возникнуть, когда существует сбой сети, который не может быть разумно предотвращен до вызова метода и, следовательно, проверяется.

Помимо RemoteException только подать заявку на код из java.rmi а также javax.rmi Пакеты (и их подпакаты), RemoteException это тип IOException, так же, как SocketException это ... и все IOExceptions проверены исключениями.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top