簡體   English   中英

無法到達的退貨聲明?

[英]Unreachable Return-Statement?

剛遇到一個有關Java中的return語句以及應使用xml語句深處返回值的方法的問題。

public static String searchNode(Node node, Node parent, String nodeResult) {
    String nodeValue = "";

    if (node.hasChildNodes()) {
        NodeList childrens = node.getChildNodes();
        for (int i = 0; i < childrens.getLength(); i++) {
            searchNode(childrens.item(i), node, nodeResult);
        }
    } else {
        nodeValue = node.getNodeValue().trim();
        if (nodeValue.length() > 0) {
            if (parent.getNodeName().equals(nodeResult)) {
                System.out.println("YESSA: " + nodeValue);
                return "2: " + nodeValue;
            }
        }
    }
    return nodeValue;
}

這是我的問題:為什么從未返回“ 2”聲明? 還是讓我寧願問:為什么最后的nodeValue仍然為空? 我已經對其進行了測試,並且代碼會打印出此“ System.out.println”內容,但從未到達那里? 如果我想讓nodeValue填寫“ else”語句中的值,該怎么辦?

編輯:

好的,我嘗試了您的建議,但是很遺憾,我沒有得到想要的結果。 進一步說明:

我有一個看起來像這樣的xml結構:

<?xml version="1.0" encoding="UTF-8" ?>
<log>
<published>2014-03-28T15:28:36.646Z</published>
<actor>
    <objectType>person</objectType>
    <id>e1b8948f-321e-78ca-d883-80500aae71b5</id>
    <displayName>anonymized</displayName>
</actor>
<verb>update</verb>
<object>
    <objectType>concept</objectType>
    <id>a1ad6ace-c722-ffa9-f58e-b4169acdb4e3</id>
    <content>time</content>
</object>
<target>
    <objectType>conceptMap</objectType>
    <id>4b8f69e3-2914-3a1a-454e-f4c157734bd1</id>
    <displayName>my first concept map</displayName>
</target>
<generator>
    <objectType>application</objectType>
    <url>http://www.golabz.eu/content/go-lab-concept-mapper</url>
    <id>c9933ad6-dd4a-6f71-ce84-fb1676ea3aac</id>
    <displayName>ut.tools.conceptmapper</displayName>
</generator>
<provider>
    <objectType>ils</objectType>
    <url>http://graasp.epfl.ch/metawidget/1/b387b6f</url>
    <id>10548c30-72bd-0bb3-33d1-9c748266de45</id>
    <displayName>unnamed ils</displayName>
</provider>
</log>

我將在下面向您展示方法調用:

searchNode(document.getFirstChild(), null, "id")

然后,我想將<actor>中子節點<id>的id值保存在變量中(此后,該方法應以break;類的方法終止,因為我不想獲取所有ID。單一ID。

您不返回遞歸結果。 您應該返回它,或設置結果。

return searchNode(childrens.item(i), node, nodeResult);

或nodeValue = searchNode(childrens.item(i),node,nodeResult);

您編寫了一個遞歸方法,該方法忽略了中間調用的結果。 僅當您直接在要查找的節點上開始搜索時,才會返回有問題的return語句。

要解決此問題,您的遞歸分支應注意遞歸調用返回的內容。 如果您需要找到第一個匹配的孩子,請執行以下操作:

for (int i = 0; i < childrens.getLength(); i++) {
    String tmp = searchNode(childrens.item(i), node, nodeResult);
    if (tmp != null && tmp.length() != 0) {
        return tmp;
    }
}

您正在遞歸地調用該方法,並且每次調用都會在堆棧上創建自己的nodeValue 考慮一下:

  • 首先,您使用具有一個子節點的節點來調用它, nodeValue為空字符串
  • 然后,在第一個for循環中,再次調用相同的方法,在堆棧上創建新的nodeValue
  • 您返回2: something從中得到2: something
  • 您對返回結果不執行任何操作,只需在原始調用中返回空字符串

現在,您可能想使用遞歸調用的結果,因此請在for循環中嘗試

nodeValue = searchNode(childrens.item(i), node, nodeResult);

暫無
暫無

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

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