0

私は次のものを持っています:

public static void main(String args[]) {

     // upload config' data for program - param' are path and Xml's Root node/ where to get data from
     confLoader conf = new confLoader("conf.xml", "config"); 

     System.out.println(conf.getDbElement("dataSource") );
     System.out.println(conf.getDbElement("dataSource") );
     System.out.println(conf.getDbElement("dataSource") );  // Fails 
...

DOM の構築と ('getDbElement()') からの解析を担当するコード:

public class confLoader{

 DocumentBuilderFactory docBuilderFactory;
 DocumentBuilder docBuilder;
 Document doc;
 NodeList nList;

 public confLoader(String path, String XmlRoot){

    try {
            docBuilderFactory = DocumentBuilderFactory.newInstance();
            docBuilder = docBuilderFactory.newDocumentBuilder();
            doc = docBuilder.parse(new File(path));
            // normalize text representation
            doc.getDocumentElement().normalize();                
    nList = doc.getElementsByTagName(XmlRoot);

  } catch (Exception e) {
    e.printStackTrace();
  } 
}

public String getDbElement(String element) {

    Node nNode = nList.item(0); //  1st item/node - sql
    try {
        if (nNode.getNodeType() == Node.ELEMENT_NODE) {     /////  Line 36 - Problematic

            Element eElement = (Element) nNode;
            return (((Node) eElement.getElementsByTagName(element).item(0).getChildNodes().item(0)).getNodeValue());
        }
    } catch (Exception ex) {
        System.out.println("Error retrieving " + element + " :" + ex.getMessage());//Thread.dumpStack();
         ex.printStackTrace();
      }
    return "not available";
 }

}

指定されたコードのスタック トレース:

  jdbc:mysql://localhost:...
  java.lang.NullPointerException
  jdbc:mysql://localhost:...
  Error retrieving dataSource :null
  not available
  at exercise.confLoader.getDbElement(confLoader.java:36)
  at exercise.Exercise.main(Exercise.java:22)

      Line 36 : if (nNode.getNodeType() == Node.ELEMENT_NODE)

XML の解析は 2 回行われ、3 回目に Xml から解析しようとすると、NullPointerException が発生します。

4

3 に答える 3

2

コードが多すぎます!また、構成要素をオンデマンドで読み取ることはそれほど有用ではありません。また、インスタンス変数に依存すると、コードのテストと理解がより困難になり、並行シナリオでは安全でなくなる可能性さえあります。これらすべてのクラス、メソッド、およびものは必要ありません。それはただの問題です

public class Exercise {

    public static void main(String[] args) throws XPathExpressionException {

        XPath xpath = XPathFactory.newInstance().newXPath();
        InputSource in = new InputSource("res/config.xml");

        String user = xpath.evaluate("//sql/user/text()", in);
        String password = xpath.evaluate("//sql/password/text()", in);
        String path = xpath.evaluate("//sql/dataSource/text()", in);

        Sql sql = new Sql(path, user, password);
    }

}

オプションで、すべての構成をに格納することでコードを少し複雑にすることもできますMap<String, String>が、実際にはProperties、XMLからロードできるのような一般的なAPIを使用することをお勧めします。

于 2012-09-25T11:45:42.603 に答える
1

ビルドパスからgnujaxp.jarを削除することで問題が解決しました。

于 2012-10-02T01:35:25.660 に答える
0

まず第一に、1 行にあまりにも多くのメソッドをチェーンしないことをお勧めします。呼び出し構造を複数の行に分割すると、読みやすくなり、デバッグが容易になります。

たとえば、次のように書き換えます。

return (((Node) (eElement.getElementsByTagName("password").item(0).getChildNodes().item(0)).getNodeValue());

に:

NodeList rootEls = eElement.getElementsByTagName("password");
Node rootEl = rootEls.item(0)
NodeList children = rootEl.getChildNodes();
Node passEl = children.item(0);
return passEl.getNodeValue();

このコードを使用して NullPointerException を取得すると、例外の行番号からさらに多くの情報を抽出できます。

次に、この場合、Java 用のさまざまな XML 処理ライブラリを調べて、XPath を使用できるものを見つけることが役立つ場合があります。Xpath に関するこのチュートリアルも参照してください。

これが役立つことを願っています。ご不明な点がございましたら、お気軽にお問い合わせください。

于 2012-09-25T11:26:04.907 に答える