Java - игнорировать исключение и продолжить

Для моего приложения Java я создаю экземпляр объекта информации о пользователе и заполняю его службой, для которой я не контролирую источник.

Код выглядит следующим образом:

// username given as parameter
UserInfo ui = new UserInfo();
try {
    DirectoryUser du = LDAPService.findUser(username);
    if (du!=null) {
       ui.setUserInfo(du.getUserInfo());
    }
} catch (Exception e) {
    // Whatever
}

Если LDAPService.findUser() не может найти пользователя, он выкинет NullPointerException и остановит остальную часть моего приложения. Это нормально, если пользовательская информация не заполнена, поэтому я хочу продолжить, не заставляя все остальное запускать исключения.

Есть ли способ сделать это?

Ответ 1

Я одобрил Амир Афганский ответ, который, похоже, остается единственным, но на самом деле отвечает на вопрос.

Но я бы написал это так:

UserInfo ui = new UserInfo();

DirectoryUser du = null;
try {
    du = LDAPService.findUser(username);
} catch (NullPointerException npe) {
    // It fine if findUser throws a NPE
}
if (du != null) {
   ui.setUserInfo(du.getUserInfo());
}

Конечно, это зависит от того, хотите ли вы поймать NPE из вызовов ui.setUserInfo() и du.getUserInfo().

Ответ 2

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

UserInfo ui = new UserInfo();
try {
    DirectoryUser du = LDAPService.findUser(username);
    if (du!=null) {
       ui.setUserInfo(du.getUserInfo());
    }
} catch (NullPointerException npe) {
    // Lulz @ your NPE
    Logger.log("No user info for " +username+ ", will find some way to cope");
}

Ответ 3

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

 try{
      throw new Exception();
 }catch (Exception ex){
   ex.printStackTrace();
 }
 System.out.println("Made it!");

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

Ответ 4

В целом считается плохой идеей игнорировать исключения. Обычно, если это необходимо, вы хотите либо уведомить пользователя о проблеме (если они этого потребуют), либо, по крайней мере, занести в журнал исключение или распечатать трассировку стека на консоль.

Однако, если это действительно не нужно (вы принимаете решение), тогда нет, нет другого способа игнорировать исключение, которое заставляет вас его поймать. Единственная ревизия в этом случае, которую я предлагаю, явно перечисляет класс Исключений, которые вы игнорируете, и некоторые комментарии относительно почему вы игнорируете их, а не просто игнорируете any, как вы это делали в своем примере.

Ответ 5

Фактически вы игнорируете исключение в своем коде. Но я предлагаю вам пересмотреть.

Вот цитата из Преступления кодирования: игнорирование исключений

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

Обычным оправданием для этого типа кода является "У меня не было времени", но есть эффект пульсации, когда код остается в этом состоянии. Скорее всего что большая часть этого типа кода никогда не выйдет в финале производство. Обзор кода или инструменты статического анализа должны шаблон ошибки. Но это не оправдание, все это делает добавление времени на поддержка и отладка программного обеспечения.

Даже если вы игнорируете его, я предлагаю вам использовать определенные имена исключений вместо имени суперкласса. т.е. используйте NullPointerException вместо Exception в предложении catch.

Ответ 6

Вы можете написать блок try-catch вокруг строки, которую вы хотите игнорировать.

Как в примере вашего кода. Если вы просто продолжаете свой код ниже закрывающей скобки блока catch, все в порядке.

Ответ 7

LDAPService должен содержать метод типа LDAPService.isExists(String userName), чтобы предотвратить выброс NPE. Если нет - это может быть обходным путем, но используйте Logging для публикации некоторого предупреждения..

Ответ 8

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