Хорошим местом для начала является JavaDocs . Они охватывают это:
Брошено, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:
- Вызов метода экземпляра нулевого объекта.
- Доступ или изменение поля нулевого объекта.
- Выполнение длины null, как если бы это был массив.
- Доступ или изменение слотов с нулевым значением, как если бы это был массив.
- Бросать нуль, как если бы это было значение Throwable.
Приложения должны бросать экземпляры этого класса для указания других незаконных видов использования нулевого объекта.
blockquote>Также, если вы попытаетесь использовать нулевую ссылку с
synchronized
, который также выдаст это исключение, за JLS :SynchronizedStatement: synchronized ( Expression ) Block
blockquote>
- В противном случае, если значение выражения равно null,
NullPointerException
.Как это исправить?
Итак, у вас есть
NullPointerException
. Как вы это исправите? Возьмем простой пример, который выдаетNullPointerException
:public class Printer { private String name; public void setName(String name) { this.name = name; } public void print() { printString(name); } private void printString(String s) { System.out.println(s + " (" + s.length() + ")"); } public static void main(String[] args) { Printer printer = new Printer(); printer.print(); } }
Идентифицирует нулевые значения
. Первый шаг - точно определить , значения которого вызывают исключение . Для этого нам нужно выполнить некоторую отладку. Важно научиться читать stacktrace . Это покажет вам, где было выбрано исключение:
Exception in thread "main" java.lang.NullPointerException at Printer.printString(Printer.java:13) at Printer.print(Printer.java:9) at Printer.main(Printer.java:19)
Здесь мы видим, что исключение выбрано в строке 13 (в методе
printString
). Посмотрите на строку и проверьте, какие значения равны нулю, добавив протоколирующие операторы или используя отладчик . Мы обнаруживаем, чтоs
имеет значение null, а вызов методаlength
на него вызывает исключение. Мы видим, что программа перестает бросать исключение, когдаs.length()
удаляется из метода.Трассировка, где эти значения взяты из
Затем проверьте, откуда это значение. Следуя вызовам метода, мы видим, что
s
передается сprintString(name)
в методеprint()
, аthis.name
- null.Трассировка, где эти значения должны быть установлены
Где установлен
this.name
? В методеsetName(String)
. С некоторой дополнительной отладкой мы видим, что этот метод вообще не вызывается. Если этот метод был вызван, обязательно проверьте порядок , что эти методы вызывают, а метод set не будет называться после методом печати. Этого достаточно, чтобы дать нам решение: добавить вызов
printer.setName()
перед вызовомprinter.print()
.Другие исправления
Переменная может иметь значение по умолчанию (и
setName
может помешать ему установить значение null):private String name = "";
Либо метод
printString
может проверить значение null например:printString((name == null) ? "" : name);
Или вы можете создать класс, чтобы
name
всегда имел ненулевое значение :public class Printer { private final String name; public Printer(String name) { this.name = Objects.requireNonNull(name); } public void print() { printString(name); } private void printString(String s) { System.out.println(s + " (" + s.length() + ")"); } public static void main(String[] args) { Printer printer = new Printer("123"); printer.print(); } }
См. также:
Я все еще не могу найти проблему
Если вы попытались отладить проблему и до сих пор не имеете решения, вы можете отправить вопрос для получения дополнительной справки, но не забудьте включить то, что вы пробовали до сих пор. Как минимум, включите stacktrace в вопрос и отметьте важные номера строк в коде. Также попробуйте сначала упростить код (см. SSCCE ).
Вот быстрое краткое изложение каждой области (с большим количеством полезных ссылок):
Ajax работает в любом современном браузере, который может выполнить JavaScript. Flex требует Flash или чего-либо еще, что может обработать SWFs, но, после того как это установлено, это - общее количество freeride до совместимости. Silverlight является хитрой и недооцененной, так тщательно рассматривают Вашу базу пользователей прежде, чем идти с этим набегом MS в богатую гонку вооружений веб-приложений. Также имейте в виду, что Silverlight все еще в бета-версии, таким образом, это может стать более широко используемым и установленным в будущем, поскольку это разрабатывается.
Я боюсь создания слишком многих операторов о производительности, потому что это действительно зависит от того, сколько Вы готовы оптимизировать и точный характер Вашего приложения. Кроме того, некоторые технологические стеки просто никогда не будут очень быстрыми. Некоторые люди там делали сравнения, но снова, это зависит от очень многих факторов (даже версия браузера, от которого Вы тестируете!). Вероятно, лучше выбрать на основе других факторов и оптимизировать, после того как Вы начали разрабатывать.
Существует "золотой стандарт" dev инструменты для каждого из трех:
Ajax имеет в основном неограниченные опции, в зависимости от остальной части Вашей технологии и возможностей выбора архитектуры. Большие вопросы, с которыми Вы на самом деле сталкиваетесь, - какие библиотеки положиться, и Google озвучил вполне прилично принятый ответ с вещами как веб-Инструментарий. Когда Вы разбираетесь вниз к нему, это - просто XML и JavaScript, правильно?
Flex от Adobe и, точно так же, как с разработкой Flash, необходимо придерживаться их инструментов собственной разработки, потому что - хорошо - они делают стандарты, как они продвигаются.
Microsoft расположила версии 2.0 и 2.5 Microsoft Expression Blend для разработки UI Silverlight 1.0 и 2 приложений соответственно. Visual Studio 2008 может использоваться, чтобы разработать и отладить приложения Silverlight (из Википедии).
Существует и официальная и неофициальная общественная, корпоративная, и поддержка с открытым исходным кодом всех трех опций. Какой бы ни с Вами уже интегрируют и который делает, Вы чувствовать больше всего дома являетесь очень отдельными вещами, но я дам этот совет: палка с тем, что Вы знаете. Если Вы - разработчик MS и имеете MSDN как Вашу домашнюю страницу, Вы, вероятно, собираетесь думать, документация Silverlight и форумы действительно полезны. Flex имеет очень похожую историю; форумы довольно хороши и если Вы уже - человек Flash, Вы собираетесь быть прямо дома с их документацией и пользовательским сообществом.
С другой стороны, Ajax в основном повсеместно, потому что можно реализовать столько различных путей и пользоваться таким количеством широко варьировавшихся библиотек. Каждая библиотека может иметь свои собственные форумы для посещения и списки рассылки для скрываний в для ответов.
Еще раз все три имеют корпоративных гигантов, пытающихся способствовать их сообществам и получить лучшую поддержку, возможную разработчикам, которые дадут им большую долю рынка в будущем.
Выбор должен, по-моему, главным образом быть основан на природе приложения, которое Вы будете создавать (например, если необходимо управлять векторной графикой, Ajax в значительной степени отсутствует), но вот некоторые общие руководящие принципы:
Повсеместность
Выбор языка программирования
(Unordeded из-за субъективности, но примечание, что Silverlight предлагает большую часть выбора. Также обратите внимание, что существующий опыт языка разработчиков в Вашей команде должен быть принят во внимание.)
Устойчивость API и совместимость
Интеграция сети/Браузера
Инструменты разработчика
Веб-время выполнения как Flex и Silverlight все предложение соблазнительные вещи, но идут с двумя большими затратами:
Даже почти повсеместный Flash не установлен на каждом веб-браузере, таким образом, путем желания использовать сменное время выполнения Вы исключаете часть своей аудитории.
Напротив, JavaScript (или Ajax) доступен на в значительной степени каждом браузере, и взаимодействует лучше с нормальными веб-страницами, но является более примитивным и ограничивающим языком. Используя его для сложных анимаций может быть хитрым, и необходимо будет протестировать приложения в большем количестве версий на большем количестве платформ, чтобы удостовериться, что это работает.
Межплатформенная совместимость не является проблемой, которой она раньше была, таким образом, проблема - это: Вы получите больше в функциях сменной библиотеки, чем Вы проиграете в аудитории, которую Вы исключаете?
Моим собственным ответом до сих пор всегда был JavaScript/Ajax, но я переоценил бы это в любом новом проекте.
Что является Вашей аудиторией: общедоступный сайт или приложение бизнеса интранет? Уровни принятия не релевантны, если у Вас есть управляемая аудитория, которая установит то, что необходимо для запущения приложения. Однако при необходимости в самой многочисленной аудитории, чтобы заставить сеть запустить успех затем, это может быть очень важно.
Какова Ваша цель? Создание чего-то для самой низкой цены? Изучение новой технологии?
Можно ли усилить существующие навыки? Если Вы уже знаете.NET затем, Silverlight получает повышение. Изучение Flex может быть интересным и полезным, но действительно ли это более полезно для Вас, чем больше опыта с технологиями.NET? Не забудьте рассматривать альтернативные издержки изучения чего-то полностью нового.
Я не вижу ясного технологического победителя в этой точке, и вероятно в течение долгого времени не будет того, таким образом, выбор сведется к довольно субъективным факторам.
Кроме того, что было уже упомянуто здесь, другая огромная вещь рассмотреть - то, чем будет Ваш UI.
Если Вы собираетесь быть использованием большого количества усовершенствованных средств управления UI как деревья, списки, средства управления вкладкой, и т.д. затем рассматриваете следующее:
JavaScript/HTML - Никакая собственная поддержка чего-либо вне вещей основные выпадающие поля, кнопки и текстовые поля. Если Вы захотите что-то как древовидное управление или управление вкладкой затем, то Вы будете иметь к самокрутке или найдете стороннюю библиотеку.
Adobe ActionScript - Собственная поддержка огромного количества усовершенствованных средств управления UI