2015-06-17 92 views
1

我試圖擺脫的NodeList的零初始化的,但它不會出現,我可以這樣做:初始化節點列表的Java

NodeList compiledNodeLIst = new Nodelist(); 

當我嘗試將它的try語句裏面,像這樣:

private NodeList compileToNodeList(String pattern, Document document){ 
      try{ 
       NodeList compiledNodeList = (NodeList) xPath.compile("/*/UserList/User").evaluate(document, XPathConstants.NODESET); 

我的返回變量無法解析,如果我將它移入try塊中,我的方法錯誤沒有返回語句。以下是完整的陳述。

private NodeList compileToNodeList(String pattern, Document document){ 
      NodeList compiledNodeList = null; 
      try{ 
       compiledNodeList = (NodeList) xPath.compile("/*/UserList/User").evaluate(document, XPathConstants.NODESET); 
      } catch (XPathExpressionException e){ 
       //TODO code for logging 
       e.printStackTrace(); 
      } 
      return compiledNodeList; 

這在技術上是行得通的,但我希望要麼擺脫空或解釋爲什麼這是不可能的。

+0

你可以通過從try和catch中返回來擺脫它,但你真的不應該強調這種事情。 –

+0

你需要問自己,如果只是捕捉異常,繼續是正確的做法。如果不可恢復,不要害怕拋出'RuntimeException'。 – MadConan

回答

1

你的方法

private NodeList compileToNodeList(String pattern, Document document){ 
     NodeList compiledNodeList = null; 
     try{ 
      compiledNodeList = (NodeList) xPath.compile("/*/UserList/User").evaluate(document, XPathConstants.NODESET); 
     } catch (XPathExpressionException e){ 
      //TODO code for logging 
      e.printStackTrace(); 
     } 
     return compiledNodeList; 
    } 

幾乎的權利。 TODO聲明告訴我你計劃只記錄錯誤。你確定這是預期的嗎?你從底層庫中得到一個錯誤,你不想告訴調用者它?如果這是真的,我可以刪除這個「答案」。但如果不是,這裏是一個更好的選擇

private NodeList compileToNodeList(String pattern, Document document){ 
     NodeList compiledNodeList = null; 
     try{ 
      compiledNodeList = (NodeList) xPath.compile("/*/UserList/User").evaluate(document, XPathConstants.NODESET); 
     } catch (XPathExpressionException e){ 
      throw new IllegalStateException("Unable to create the compiled node list: " + e.getMessage(), e); 
     } 
     return compiledNodeList; 
} 

拋出一個異常,當你得到意想不到的狀態是正確的事情。我正在展示RuntimeException類型,因爲這只是我滾動的方式,但您也可以選擇一些已選中的Exception,儘管這意味着必須處理將其投入鏈中。

捕獲異常並創建新的EmptyNodeList也是可行的,假設沒有問題(不讓調用者知道問題存在)。

+0

謝謝!這實際上讓電話知道很有意義(一旦你指出了這一點,這似乎更明顯)。 –

0

最好讓這個方法的調用者檢查nodelist是否爲null。

如果你還必須有一個非空的返回值(在例外的情況下),你可以創建一個虛擬的或匿名實現節點列表,並返回:

public static final class EmptyNodeList implements NodeList{ 
//no op methods 
} 
private NodeList compileToNodeList(String pattern, Document document){ 
     NodeList compiledNodeList = null; 
     try{ 
      compiledNodeList = (NodeList) xPath.compile("/*/UserList/User").evaluate(document, XPathConstants.NODESET); 
     } catch (XPathExpressionException e){ 
      //TODO code for logging 
      e.printStackTrace(); 
      compiledNodeList = new EmptyNodeList(); 
     } 
     return compiledNodeList; 
} 

public static final NodeList emptyNodeList = new NodeList() { 
    @Override 
    public Node item(int index) { 
     return null; 
    } 

    @Override 
    public int getLength() { 
     return 0; 
    } 
};