簡體   English   中英

異常執行數據流,為什么拋出異常時我的對象為null?

[英]exception execution data flow, why is my object is null when exception thrown?

我不確定為什么會這樣,但是我有一個簡單的設置,其中調用者的返回值為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;
}

謝謝!

您的代碼按以下順序執行:

  1. 調用retrieveDocuments
  2. 將結果分配給myXDSConsumerRequestHandler

如果在步驟1中引發異常,則步驟2將永遠不會發生。

通常,您不能同時引發異常和返回值。

如果retrieveDocuments()引發異常,則它永遠沒有機會返回某些內容。 語句myXDSConsumerRequestHandler = RetrieveDocSetUtil.retrieveDocuments()無法正常完成。

無法同時從方法中捕獲異常並接收返回值。

如果retrieveDocuments()具有有意義的意義,即使遇到這些異常,它也可以返回給調用者,那么此方法應該在內部捕獲異常並返回適當的返回值,而不是允許異常傳播到調用方法。

您的問題來自於做過多的方法。 它都獲取RetrieveDocumentSetImpl並嘗試使用它。

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

將此分為兩種方法:

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

它要么返回處理程序,要么失敗,並引發Exception,並且

 myXDSConsumerRequestHandler.retrieveDocumentSet(docRepoMap);

然后,您的調用者可以調用第一個方法,獲取返回碼,然后,如果願意,請嘗試嘗試各種操作(例如,調用第二個方法),以捕獲它們引發的異常。

這是我的建議

  1. 在公共的retrieveDocuments(NIST,multipleRetrieveMap)方法上添加適當的處理以確保將正確的參數傳遞給您的方法。 這將解決與VerboseIllegalArgumentException特別相關的異常,在將參數傳遞給retrieveDocuments方法之前,應完成參數驗證/處理。 恐怕如果遇到異常,則由於先前發布者所述的原因,您將無法再獲取對象。 無法同時從方法中捕獲異常並接收返回值。 這就是為什么正確的驗證和處理非常重要的原因。
  2. 確定異常的原因之后,定義/創建自己的異常。 這將為您節省很多時間和將來的麻煩。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM