Java - 忽略异常并继续

时间:2011-12-08 19:11:08

标签: 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并将我的应用程序的其余部分停止。如果没有填充用户信息也没关系,所以我希望能够继续而不会导致其他一切开始抛出异常。

有办法做到这一点吗?

8 个答案:

答案 0 :(得分:22)

我赞成Amir Afghani's answer,这似乎是唯一一个实际回答问题的人。{/ p>

但我会这样写的:

UserInfo ui = new UserInfo();

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

当然,这取决于您是否希望从ui.setUserInfo()du.getUserInfo()来电中捕获NPE。

答案 1 :(得分:19)

您可以明确地捕获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");
}

答案 2 :(得分:3)

您已经在代码中执行此操作。运行以下示例。捕获将“处理”异常,并且您可以向前移动,假设您捕获和处理的任何内容没有破坏您未预料到的道路上的代码。

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

但是,您应该始终正确处理异常。您可以通过“忽略”异常来进入一些非常混乱的情况并编写难以维护的代码。你应该只在你真正处理异常的任何问题时才这样做,以至于它确实不会影响程序的其余部分。

答案 3 :(得分:2)

忽略异常通常被认为是个坏主意。通常,如果合适,您希望向用户通知问题(如果他们愿意),或者至少要记录异常,或者将堆栈跟踪打印到控制台。

然而,如果那确实没有必要(你是做出决定的那个)那么不,没有别的办法可以忽略一个强迫你抓住它的异常。在这种情况下,我建议的唯一修订是明确列出您忽略的例外类,并对为什么忽略它们的一些评论,而不是简单地忽略< strong>任何异常,正如您在示例中所做的那样。

答案 4 :(得分:1)

您实际上忽略了代码中的异常。但我建议你重新考虑一下。

以下是Coding Crimes: Ignoring Exceptions

的引用
  

首先,应该至少记录异常,而不是   刚写到控制台。此外,在大多数情况下,例外   应该被抛回给调用者以便他们处理。如果它   不需要抛回调用者,然后是异常   应该处理。而且一些评论也会很好。

     

这类代码的通常借口是“我没有时间”,但是   代码处于此状态时会产生连锁反应。机会是   大多数此类代码永远不会在决赛中出现   生产。代码评论或静态分析工具应该抓住这一点   错误模式。但这不是借口,所有这一切都是为了增加时间   维护和调试软件。

即使您忽略它,我建议您使用特定的异常名称而不是超类名称。即,在NullPointerException条款中使用Exception代替catch

答案 5 :(得分:0)

你可以在想要忽略的行周围写一个try-catch块。

就像你的示例代码一样。如果你只是将你的代码继续在catch块的结束括号下面,那么就好了。

答案 6 :(得分:0)

LDAPService应该包含像LDAPService.isExists(String userName)这样的方法来使用它来防止抛出NPE。如果不是 - 这可能是一种解决方法,但使用Logging发布一些警告..

答案 7 :(得分:0)

打印STACK跟踪,记录或向用户发送消息是处理异常的非常糟糕的方法。有没有人可以用适当的步骤描述修复异常的解决方案然后再次尝试破坏的指令?