【问题标题】:Null return from a object using SAXParser - NullPointerException使用 SAXParser 从对象返回空值 - NullPointerException
【发布时间】:2014-09-04 19:30:09
【问题描述】:

我正在使用 SAXParser 解析 XML 并尝试获取特定节点的值,但我的代码返回 null。我不知道我做错了什么。这是我的代码。任何帮助将不胜感激。

import java.io.IOException;
import java.io.StringReader;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class SAXParserUsage extends DefaultHandler {

    SAXParserFactory factory;
    SAXParser parser;
    DefaultHandler handler;
    private String elementName;
    private String authorizationCode;

    public String getAuthCodeResponse(String message) throws SAXException, IOException, ParserConfigurationException {
    factory = SAXParserFactory.newInstance();
    handler = new SAXParserUsage();
    parser = factory.newSAXParser();
    parser.parse(new InputSource(new StringReader(message)), handler);
    return authorizationCode;
    }

    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
    elementName = qName;
    }

    public void characters(char[] text, int start, int length) throws SAXException {
    if (elementName.equals("code")) {
        String code = new String(text, start, length);
        System.out.println("setting code: " + code);
        authorizationCode = code;
    }

    }

    public void endElement(String arg0, String arg1, String arg2) throws SAXException {
    }

    public static void main(String[] args) throws SAXException, IOException, ParserConfigurationException {
    SAXParserUsage usage = new SAXParserUsage();
    String code = usage.getAuthCodeResponse(getSampleString());
    System.out.println("code is: " + code);
    }

    private static String getSampleString() {
    String sample = "<washCode><getCode><code>12345</code></getCode></washCode>";
    return sample;
    }

}

【问题讨论】:

  • 试试return handler.authorizationCode
  • @NathanHughes 方法 getAuthCodeResponse 正在返回 Null,而我在解析期间设置了 authorizationCode 的值
  • @Fildor 谢谢它的工作。
  • @Fildor 请您回答同样的问题并给出一些解释

标签: java xml saxparser


【解决方案1】:
public String getAuthCodeResponse(String message) throws SAXException, IOException,     ParserConfigurationException {
factory = SAXParserFactory.newInstance();
handler = new SAXParserUsage(); // <--- You create local instance here
parser = factory.newSAXParser();
parser.parse(new InputSource(new StringReader(message)), handler);
// ^^ parser writes to local instance here but ...
return authorizationCode;
//    you return authCode field of the instance that this method is invoked on, 
//    which has not been changed by this method. 
//    So if it was null before, it still is null.
}

所以你要么必须return handler.authorizationCode 要么parser.parse(..., this);

【讨论】:

    【解决方案2】:

    还请注意,您不能依赖于将元素的内容一次性传递给 characters() 方法。它可以拆分为对 characters() 方法的多个调用。这不会经常发生——通常只有当文本包含实体引用或者它跨越两个 I/O 缓冲区之间的边界时——但它很少见的事实使得这个错误非常隐蔽。您需要在多次调用中缓冲内容,并在遇到 endElement() 事件时保存。

    您的代码中还有另一个技术错误,即如果解析器的 http://xml.org/sax/features/namespace-prefixes 属性采用其默认值“false”,则解析器没有义务向 startElement() 提供 qName 参数。但是,我从来没有遇到过无法提供这个参数的解析器,所以这个在实践中不太可能打到你。

    【讨论】:

      【解决方案3】:

      尝试返回

      handler.authorizationCode;

      而不是

       return authorizationCode;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-31
        • 2018-08-07
        • 2014-10-04
        • 2013-01-17
        • 1970-01-01
        • 2020-12-09
        • 2011-08-21
        • 1970-01-01
        相关资源
        最近更新 更多