异常执行数据流,为什么抛出异常时我的对象为null?

时间:2011-02-16 14:52:37

标签: java exception

我不确定为什么会这样,但我有一个简单的设置,其中调用者的返回值为null。

我调用一个可能抛出注册异常的函数。当它发生时,myXDSConsumerRequestHandler保持为空。问题是我能够从已注册的事件中恢复(检查被调用者上的对象)。那么如何调用retrieveDocuments并将我的对象恢复?

我理解抛出异常时流程会被破坏,所以我应该在更高级别捕获异常吗?

这是来电者:

try {
    myXDSConsumerRequestHandler = 
        RetrieveDocSetUtil.retrieveDocuments(NIST, multipleRetrieveMap);
} catch (VerboseIllegalArgumentException e) {

} catch (XDSException e) {

}

这是被叫方:

public static RetrieveDocumentSetImpl retrieveDocuments(
        String repoURL, Map<String, String> docRepoMap) 
    throws VerboseIllegalArgumentException, XDSException {

    RetrieveDocumentSetImpl myXDSConsumerRequestHandler = 
            new RetrieveDocumentSetImpl(repoURL);
    myXDSConsumerRequestHandler.retrieveDocumentSet(docRepoMap);
    return myXDSConsumerRequestHandler;
}

谢谢!

4 个答案:

答案 0 :(得分:3)

您的代码按以下顺序执行:

  1. 致电retrieveDocuments
  2. 将结果分配给myXDSConsumerRequestHandler
  3. 如果在步骤1中抛出异常,则步骤2将永远不会发生。

    通常,您不能同时抛出异常并返回值。

答案 1 :(得分:3)

如果retrieveDocuments()抛出异常,那么它永远不会有机会返回一些东西。声明myXDSConsumerRequestHandler = RetrieveDocSetUtil.retrieveDocuments()未正常完成。

无法从方法中捕获异常并接收返回值。

如果retrieveDocuments()有一些有意义的东西,它甚至可以在遇到这些异常时返回给调用者,那么这个方法应该在内部捕获异常并返回一个适当的返回值,而不是允许异常传播到调用方法

答案 2 :(得分:0)

你的问题来自于甲基化物做得太多。它都获取RetrieveDocumentSetImpl并尝试使用它。

RetrieveDocumentSetImpl myXDSConsumerRequestHandler = 
        new RetrieveDocumentSetImpl(repoURL);
myXDSConsumerRequestHandler.retrieveDocumentSet(docRepoMap);
return myXDSConsumerRequestHandler;

将其分为两种方法:

RetrieveDocumentSetImpl myXDSConsumerRequestHandler = 
        new RetrieveDocumentSetImpl(repoURL);
return myXDSConsumerRequestHandler;

返回处理程序或失败,抛出异常,

 myXDSConsumerRequestHandler.retrieveDocumentSet(docRepoMap);

然后你的调用者可以调用第一个方法,获取返回代码,然后如果他们选择尝试各种各样的东西,比如cal第二个,捕获他们抛出的异常异常。

答案 3 :(得分:0)

以下是我的建议

  1. 在公共 retrieveDocuments(NIST,multipleRetrieveMap) 方法上添加正确的处理,以确保将正确的参数传递给您的方法。这将解决与 VerboseIllegalArgumentException 特别相关的异常,在将参数传递给 retrieveDocuments 之前,应该进行参数验证/处理强>方法。我担心,如果您遇到异常,则无法再根据前面海报所述的原因检索您的对象 无法从方法中捕获异常并收到返回值。 这就是为什么正确的验证和处理非常重要。
  2. 确定异常原因后,定义/创建自己的异常。这将为您节省大量时间和未来的头痛。