Java — Избавление от исключения NullPointerException

#java #nullpointerexception

#java #исключение nullpointerexception

Вопрос:

Подумайте о двух случаях case1 и case2 плюс двух методах method1 и method2. Скажем, метод1 решает случай 1, а метод2 решает случай 2. Теперь у меня есть программа, которая может закончиться с case1 или case2. В моих кодах я вызываю method1 независимо от того, какой случай происходит. Но, если возникает случай2, метод1 выдает исключение nullpointerexception.

Чего я хочу, так это следующего: мои коды должны сначала вызывать метод1, если возникает исключение, затем вызывается метод2. Как мне это сделать? Поскольку у меня нет информации о try и catch, мне действительно нужна помощь!

Комментарии:

1. Я думаю, что некоторый код лучше любых объяснений.

2. Я думаю, вы правы. Допустим, у меня есть TreeNode<City> parentNode, который будет левой частью равенства, а правой рукой будет search (parent, this) или search2 (parent, this). Тем не менее, search и search2 могут возвращать значение null, чего я не хочу. Теперь, как я должен реализовать?

3. пожалуйста, отредактируйте свой вопрос и опубликуйте какой-нибудь пример кода, а не только имена переменных и сигнатуры методов.

4. Вы могли бы вызвать search1(), затем проверить, равен ли результат null, и если да, то вызвать search2. Если search2 также равен null, тест на равенство должен завершиться неудачей.

Ответ №1:

Вы могли бы сделать это:

     try {
        method1();
    }
    catch ( Exception e ) {
        method2();
    } 
  

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

     if ( isCase2() ) {
        method2();
    }
    else {
        method1();
    }
  

Комментарии:

1. Как написал @Vladimir, если вы собираетесь использовать try / catch, лучше создать свой собственный объект исключения из method1, чем полагаться на NPE (который может возникнуть даже в случае 1 из-за других проблем).

2. Согласен. Первый приведенный выше пример предназначен для буквального удовлетворения OP: «мои коды должны сначала вызывать method1, если возникает исключение, затем вызывается method2». Если вы можете отличить case1 от case2 априори, то это предпочтительнее использования любого исключения.

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

Ответ №2:

Перехват NullPointerException — плохая практика — вы можете перехватить не то конкретное исключение, которое хотите перехватить. У вас есть два варианта:

1) Создайте свое собственное исключение и перехватите его позже:

   public void method1(Case caze) throws MyException {
    if (case.getType() == CaseType.CaseOne) {
       // processing
    } else {
       throw new MyException("Wrong case type");
    }
  }
  

И клиентский код:

 try {
   method1(caze);
} catch (MyException e) {
   // log the excpetion
   method2(caze);
}
  

2) Верните логический флаг, указывающий, что обработка была успешно завершена.

Помните, что всегда лучше анализировать значения, чем использовать механизм try-catch в ваших ситуациях. Я бы предложил вариант # 2 для вас.