• Java xml出现错误 javax.xml.transform.TransformerException: java.lang.NullPointerException


    转自:https://www.jb51.net/article/98644.htm

    Java xml出现错误 javax.xml.transform.TransformerException: java.lang.NullPointerException解决办法:

    利用Java操作XML,在操作XML过程中,执行到最后一步,在利用Transformer进行XML转换时出现NullPointerException错误,出问题的部分代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    //转换
    TransformerFactory tFactory =TransformerFactory.newInstance();
    Transformer transformer = tFactory.newTransformer();
    //需要转换的内存中XML源文件
    DOMSource source = new DOMSource(xmlDoc1);
    //生成的xml文件
    File xmlDoc2 = new File(outPutPath+generateXmlFileName);
    StreamResult result = new StreamResult(xmlDoc2);
    //转换
    transformer.transform(source, result);

    运行到transform函数时出现以下错误(比较长,由于我是利用SWING设计图形界面的,所以会有一些图形界面事件调用的错误):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    javax.xml.transform.TransformerException: java.lang.NullPointerException
        at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transfor
    m(TransformerImpl.java:717)
        at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transfor
    m(TransformerImpl.java:313)
        at operation.AddNeuronID.addNeuronId(AddNeuronID.java:273)
        at operationUI.AddNeuronIDListener.constructor2Perform(AddNeuronIDListen
    er.java:245)
        at operationUI.AddNeuronIDListener.actionPerformed(AddNeuronIDListener.j
    ava:85)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:19
    95)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.jav
    a:2318)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel
    .java:387)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242
    )
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonL
    istener.java:236)
        at java.awt.Component.processMouseEvent(Component.java:6041)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
        at java.awt.Component.processEvent(Component.java:5806)
        at java.awt.Container.processEvent(Container.java:2058)
        at java.awt.Component.dispatchEventImpl(Component.java:4413)
        at java.awt.Container.dispatchEventImpl(Container.java:2116)
        at java.awt.Component.dispatchEvent(Component.java:4243)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322
    )
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)
        at java.awt.Container.dispatchEventImpl(Container.java:2102)
        at java.awt.Window.dispatchEventImpl(Window.java:2440)
        at java.awt.Component.dispatchEvent(Component.java:4243)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThre
    ad.java:273)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.
    java:183)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre
    ad.java:173)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
    Caused by: java.lang.NullPointerException
        at com.sun.org.apache.xml.internal.serializer.ToUnknownStream.characters
    (ToUnknownStream.java:317)
        at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java
    :240)
        at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java
    :226)
        at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java
    :226)
        at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java
    :226)
        at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java
    :226)
        at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java
    :226)
        at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java
    :226)
        at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java
    :226)
        at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java
    :226)
        at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java
    :132)
        at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java
    :94)
        at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transfor
    mIdentity(TransformerImpl.java:662)
        at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transfor
    m(TransformerImpl.java:708)
        ... 29 more
    ---------
    java.lang.NullPointerException
        at com.sun.org.apache.xml.internal.serializer.ToUnknownStream.characters
    (ToUnknownStream.java:317)
        at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java
    :240)
        at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java
    :226)
        at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java
    :226)
        at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java
    :226)
        at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java
    :226)
        at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java
    :226)
        at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java
    :226)
        at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java
    :226)
        at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java
    :226)
        at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java
    :132)
        at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java
    :94)
        at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transfor
    mIdentity(TransformerImpl.java:662)
        at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transfor
    m(TransformerImpl.java:708)
        at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transfor
    m(TransformerImpl.java:313)
        at operation.AddNeuronID.addNeuronId(AddNeuronID.java:273)
        at operationUI.AddNeuronIDListener.constructor2Perform(AddNeuronIDListen
    er.java:245)
        at operationUI.AddNeuronIDListener.actionPerformed(AddNeuronIDListener.j
    ava:85)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:19
    95)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.jav
    a:2318)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel
    .java:387)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242
    )
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonL
    istener.java:236)
        at java.awt.Component.processMouseEvent(Component.java:6041)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
        at java.awt.Component.processEvent(Component.java:5806)
        at java.awt.Container.processEvent(Container.java:2058)
        at java.awt.Component.dispatchEventImpl(Component.java:4413)
        at java.awt.Container.dispatchEventImpl(Container.java:2116)
        at java.awt.Component.dispatchEvent(Component.java:4243)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322
    )
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)
        at java.awt.Container.dispatchEventImpl(Container.java:2102)
        at java.awt.Window.dispatchEventImpl(Window.java:2440)
        at java.awt.Component.dispatchEvent(Component.java:4243)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThre
    ad.java:273)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.
    java:183)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre
    ad.java:173)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)

           一开始我也感到奇怪,transform函数只是把在内存中的XML树转换成文件,为何会出现nullPointer错误呢。上网查了一下,没什么人找到答案,最后在(http://blog.awe.cz/post/english/beware-of-null-text-nodes/)这个blog中找到相当有用的答案.

          其实认真看看出错的信息,会发现有个信息比较重要:

    1
    2
    3
    java.lang.NullPointerException
    at com.sun.org.apache.xml.internal.serializer.ToUnknownStream.characters(ToUnknownStream.java:317)
    at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:240)

         从这里可以看出是由于com.sun.org.apache.xml.internal.serializer.ToUnknownStream.java文件中的characters函数出错,所在行数是317,到jdk安装目录,找到src,到相应的文件夹serializer中找到ToUnknownStream.java,找到以下函数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    /**
      * Converts the String to a character array and calls the SAX method
      * characters(char[],int,int);
      *
      * @see ExtendedContentHandler#characters(String)
      */
      public void characters(String chars) throws SAXException
      {
        final int length = chars.length();
        if (length > m_charsBuff.length)
        {
          m_charsBuff = new char[length*2 + 1];
        }
        chars.getChars(0, length, m_charsBuff, 0);
        this.characters(m_charsBuff, 0, length); 
      

           很明显,注意int length = chars.length(); 如果参数chars是null的话,调用length函数就会出现nullpoiterException错误。再上一层,com.sun.org.apache.xalan.internal.xsltc.trax下的DOM2TO.java文件的parse函数(240行):

    1
    2
    3
    case Node.TEXT_NODE:
        _handler.characters(node.getNodeValue());
        break;

          在这里,就可以知道characters函数为什么出现null参数了。原因是此结点是文本结点TEXT_NODE,而调用本结点中没有内容(null),当调用getNodeValue时,返回null.

          上升到transform函数,出现结点内容为null,那在DOMSource类中,由于它是在内存中建立起来的XML树,所以肯定是这个XML树中的有一个或多个元素或结点的内容为null。

          OK,问题原因找到。解决办法很简单,DOMSource中有元素或结点为null,那一定是在操作XML时,或者是修改内容,添加元素等等操作,使内容变为null。所以现在需要做的就是找到修改或添加元素内容的代码,把有可能出现null的情况进行处理,如果检测到为null,则不修改XML或不添加此元素。最简单的方法就是用if语句。即setNodeValue(String str)或setTextContent(String str)之前,先查看参数str是否为空(if(str == null)),如果空则不调用此函数。

          而在我的程序中,确实我是把空的内容加入到元素中。代码如下:deviceAndIDMap是一个HashMap,当它调用get时,不存在此主键时,会返回null.

    1
    2
    3
    String neuronIdStr = deviceAndIDMap.get(nameContent);
    //更新
    neuronIdElem.getFirstChild().setNodeValue(neuronIdStr);

        因此我加一下if语句,就可以解决问题了,代码(此代码是在for循环中的,因此用coninue来跳过本次的修改)如下:

    1
    2
    3
    4
    5
    6
    7
    8
    String neuronIdStr = deviceAndIDMap.get(nameContent);
    if(neuronIdStr == null)
    {
       continue;
    }
    //更新
    neuronIdElem.getFirstChild().setNodeValue(neuronIdStr);
                   

        问题解决!

  • 相关阅读:
    MySQL数据库时间查询
    MySQL函数转储存(当前月数据同步)
    字节数截取字符串
    JAVA 内部静态类--解析静态内部类的使用目的与限制
    Java集合框架学习总结
    JDBC中的Statement和PreparedStatement的区别
    java jdbc的优化之BeanUtils组件
    jdbc java数据库连接 11)中大文本类型的处理
    jdbc java数据库连接 10)批处理
    jdbc java数据库连接 9)事务编程
  • 原文地址:https://www.cnblogs.com/sharpest/p/11555773.html
Copyright © 2020-2023  润新知