English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Слышал老师说, что в будущем большая часть исключений будут NullPointer. Так что найдите время для игры, чтобы узнать, что такое исключение NullPointer
1: Основные причины возникновения исключения NullPointer:
(1) При вызове метода объекта, который не существует, возникает исключение obj.method() // объект obj не существует
(2) При доступе или изменении поля объекта, которое не существует, возникает исключение obj.method() // метод method не существует
(3) Неинициализированная строковая переменная;
(4) Объекты интерфейсного типа не�始化ированы конкретным классом, например:
List lt; — ошибка будет возникать
List lt = new ArrayList(); — ошибка не будет возникать
Если объект пуст, вы не проверили его на пустоту. Попробуйте добавить строку перед следующим кодом:
if(rb!=null && rb!="")
Измените на:
if(rb==null); if(rb!==null&&rb!="") или if(("").equals(rb))
Решение проблемы NullPointer:
Особое внимание обратите на строку, где произошла ошибка, и диагностируйте конкретную ошибку по двум主要原因ам, вызывающим исключение NullPointer. Чтобы избежать возникновения исключений NullPointer, лучше всего в процессе проверки и обработки значения использовать "null" или пустое значение.
Краткий анализ常见 NullPointer исключений:
(1) Ошибка NullPointer Java.lang.NullPointerException
В Java есть 8 основных типов данных, переменные могут иметь значения по умолчанию. Если переменной не было назначено значение, виртуальная машина Java не сможет корректно скомпилировать программу. Поэтому использование основных типов данных Java обычно не вызывает исключение NullPointer. В реальном разработке, большинство исключений NullPointer связано с операциями с объектами.
Вторая часть: Механизм обработки исключений в Java
Для обработки кода, который может вызвать исключения, существуют два способа:
В методе используется предложение try...catch для перехвата и обработки исключений, можно использовать несколько catch-уток для соответствия множеству исключений. Например:
public void p(int x){ try{ ... }catch(Exception e){ ... }finally{ ... }}
Второе, для обработки невозможных исключений или преобразуемых исключений, в заявлении метода через
выражение throws выбрасывает исключение. Например:
public void test1() throws MyException{ ... if(....){ throw new MyException(); }}
Если каждый метод просто выбрасывает исключение, то в多层 вложенных вызовах методов Java виртуальная машина ищет код блока, в котором обрабатывается исключение, от места возникновения исключения до места обработки. Затем исключение передаётся соответствующему выражению catch. Если Java виртуальная машина доходит до метода main() в呼叫ной стеке, и до сих пор не нашла блок обработки исключения, она выполняет следующие шаги:
Первое, вызывать метод printStackTrace() объекта исключения, чтобы распечатать информацию о методе вызова и исключении.
Второе, если исключение возникает в главном потоке, то весь процесс terminates; если в не главном потоке, то останавливается этот поток, а другие продолжают работать.
Анализ и размышления показывают, что чем раньше обрабатываются исключения, тем меньше ресурсов и времени они потребляют, и тем меньше影响的范围. Поэтому не следует передавать исключения, которые можно обработать, вызовутелям.
Ещё один момент, который нельзя упускать из виду: код в блоке finally всегда должен выполняться, что гарантирует надёжность кода, который должен выполняться в любых условиях. Например, при возникновении исключения в запросе к базе данных, следует освободить соединение JDBC и т.д. Выражение finally выполняется до выполнения выражения return, независимо от их местоположения и наличия исключения в блоке try. Единственный случай, когда выражение finally не выполняется, это когда метод выполняет System.exit(). Действие System.exit() - это остановка текущей работы Java виртуальной машины. В блоке finally не рекомендуется изменять значение переменной, чтобы изменить значение return, и также не рекомендуется использовать в блоке finally выражение return, это не имеет смысла и может привести к ошибкам.
Наконец, следует отметить грамматические правила обработки исключений:
Первое,Выражение try не может существовать в отдельности и может использоваться вместе с catch и finally.
Структуры try...catch...finally, try...catch и try...finally, в которых catch-выражение может быть одним или несколькими, а finally-выражение может быть только одним, и ключевые слова try, catch, finally не могут использоваться в отдельности.
Второй:}}Область действия переменных в блоках try, catch и finally независима и не может быть взаимно доступна. Если нужно, чтобы переменные были доступны в всех трёх блоках, их нужно определить вне этих блоков.
Третий:При наличии нескольких блоков catch Java виртуальная машина будет соответствовать одному из классов исключений или его подклассам, и выполнит этот блок catch, а не другие блоки catch.
Четвертый:После предложения throw не допускается следовать другим предложениям,因为这些 не имеют возможности被执行.
Пятый:Если метод вызывает другой метод, который объявляет выбрасывание исключения, то этот метод должен либо обрабатывать исключение, либо объявлять выбрасывание.
2.2 Разница между ключевыми словами throw и throws:
throw используется для выбрасывания исключения в методе. Грамматический формат: throw объект_исключения.
throws используется для объявления того, какие исключения может выбрасывать метод, после имени метода, грамматический формат:
throws тип_исключения1, тип_исключения2... тип_исключенияn.
Третий: ниже перечислены несколько ситуаций, при которых может возникнуть исключение NullPointerException, и соответствующие решения:
Кодовый фрагмент 1:
out.println(request.getParameter("username"));
Анализ:Функция фрагмента кода 1 очень проста - это вывод значения, введенного пользователем "username".
Объяснение:Видимо,上面的 строки не содержат грамматических ошибок, и в большинстве случаев не встречаются проблемы. Но если пользователь не предоставляет значение поля формы "username" при вводе данных или напрямую вводит через определенный путь, значение request.getParameter("username") будет пустым (обратите внимание, не пустая строка, а пустой объект null.), и метод println объекта out не может напрямую работать с пустым объектом, поэтому страница JSP, в которой находится кодовый фрагмент 1, будет выбрасывать исключение "Java.lang.NullPointerException". И даже если объект может быть пустым, можно вызывать методы Java.lang.Object или Object объекта本身, такие как toString(), equal(Object obj) и т.д.
Кодовый фрагмент 2:
String userName = request.getParameter("username"); If (userName.equals("root")) {....}
Анализ:Функция кодового фрагмента 2 заключается в проверке предоставленного пользователем имени пользователя, если это пользователь с именем "root", то выполняются некоторые особые действия.
Объяснение:В кодовом фрагменте 2, если пользователь не предоставил значение поля формы "username", строковый объект userName будет равен null, и не можно сравнивать объект null с другим объектом напрямую, также, страница JSP, в которой находится кодовый фрагмент 2, будет выбрасывать ошибку "NullPointerException".
Одна хитрость:Если нужно сравнить возвращаемое значение метода с константой, можно положить константу спереди, чтобы избежать вызова метода equals объекта null. Например:
Если ("root".equals(userName)) {....}
Даже если объект userName вернет объект null, здесь не будет исключения NullPointer, и он может работать normalmente.
фрагмент кода 3:
String userName = session.getAttribute("session.username").toString();
Анализ:Функция кодового фрагмента 3 заключается в извлечении значения session.username из сессии и присвоении его строковому объекту userName.
Объяснение:В общем случае, если пользователь уже провел сеанс, проблем не возникает; но если в этот момент сервер приложений перезапускается, а пользователь еще не повторно вошел в систему (может быть, пользователь закрыл браузер, но оставил открытой страницу.), то в этом случае значение сеанса будет аннулировано, и значение session.username в сеансе станет пустым. Прямое выполнение toString() на пустом объекте приведет к тому, что система выбросит исключение NullPointer.
фрагмент кода 4:
public static void main(String args[]){ Person p=null; p.setName("张三"); System.out.println(p.getName()); }
Анализ:Декларация объекта Person и вывод его的名字 Name.
Объяснение:В этот момент ваш p вызовет исключение NullPointer, потому что вы только объявили объект типа Person, но не создали его, поэтому в его куче нет адреса ссылки, будьте осторожны, всегда создавайте объект, когда используете методы объекта.
A: начинать использовать объект, не проверяя, пуст он или нет.
(JSP) фрагмент кода 1:
out.println(request.getParameter("username"));
Анализ:Функция фрагмента кода 1 очень проста - это вывод значения, введенного пользователем "username".
Объяснение:Видимо, в данном предложении нет грамматических ошибок, и в большинстве случаев с этим не возникает проблем. Однако, если пользователь не предоставляет значение поля "username" в форме или напрямую вводит данные, минуя форму, значение request.getParameter("username") будет равно null (обратите внимание, это не пустая строка, а пустой объект null.), и метод println объекта out не может напрямую работать с пустым объектом, поэтому страница JSP, содержащая фрагмент кода 1, будет выбрасывать исключение "Java.lang.NullPointerException". И даже если объект может быть пустым, все равно вызываются методы Java.lang.Object или самого объекта Object, такие как toString(), equal(Object obj) и т.д.
(JSP) кодовый фрагмент 2:
String userName = request.getParameter("username"); If (userName.equals("root")) {....}
Анализ:Функция кодового фрагмента 2 заключается в проверке предоставленного пользователем имени пользователя. Если имя пользователя равно "root", выполняются особые действия.
Объяснение:В кодовом фрагменте 2, если пользователь не предоставил значение поля формы "username", строковый объект userName будет null, и нельзя сравнивать null с другим объектом, а также страница JSP, в которой находится кодовый фрагмент 2, выбросит ошибку (Java.lang.NullPointerException) "пустой указатель".
(JSP) кодовый фрагмент 3:
String userName = session.getAttribute ("session.username").toString();
Анализ:Функция кодового фрагмента 3 заключается в извлечении значения session.username из сессии и присвоении его строковому объекту userName.
Объяснение:В общем случае, если пользователь уже начал сессию, проблем не будет; но если в этот момент сервер приложения перезапускается, а пользователь еще не повторно вошел в систему (возможно, пользователь закрыл браузер, но оставил открытой страницу.), то значение этой сессии станет недействительным, и значение session.username в сессии станет пустым. Прямое выполнение toString() на объекте null приведет к тому, что система выбросит исключение (Java.lang.NullPointerException) "пустой указатель".
Вот и все, что я могу предложить вам о кратком рассмотрении обработки исключений Java, связанных с пустыми указателями. Надеюсь, вам понравится и вы поддержите tutorial!