利用JDKAPI幫助文檔發(fā)現(xiàn)錯誤原因

在java編寫代碼過程中,經(jīng)常遇到編譯器沒有提示錯誤,而控制臺提示異常報錯,對于初學(xué)者來說面對一串串英文的錯誤信息可能無從下手,這篇文檔就用實(shí)例和API幫助文檔來解讀錯誤信息。

錯誤實(shí)例一:java中使用dom解析xml時在指定標(biāo)簽前添加子節(jié)點(diǎn)

xml代碼:book2.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?><書架>
    <書 編號="b2">
        <書名>javaweb開發(fā)大全</書名>
        <作者>班長</作者>
        <售價>99.8元</售價>
        <簡介>這是不錯啊</簡介>
    </書>
    <書>
        <書名>葵花寶典</書名>
        <作者>岳不群</作者>
        <售價>99.8</售價>
        <簡介>欲練此功...</簡介>
        <出版社>人民出版社</出版社>
    </書>
</書架>

java代碼:JaxpDomTest.java
<blockquote>

package cn.itcast.jaxp;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import cn.itcast.utils.JaxpDomUtil;

/**
 * JAXP的DOM解析XML
 * @author Administrator
 *
 */
public class JaxpDomTest {
    
    public static void main(String[] args) {
        try {
            run2();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void run2() throws Exception{
        // 獲取工廠類
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        // 獲取解析器
        DocumentBuilder builder = factory.newDocumentBuilder();
        // 解析xml,返回document對象
        Document document = builder.parse("src/book2.xml");
        // 獲取第二本書
        Node book2 = document.getElementsByTagName("書").item(1);
        // 創(chuàng)建元素對象
        Element chubanshe = document.createElement("出版社");
        // 設(shè)置文本內(nèi)容
        chubanshe.setTextContent("人民出版社");
        //在book2中添加出版社標(biāo)簽
        book2.appendChild(chubanshe);
        
        //使用insertbefore方法想把出版社標(biāo)簽插入到售價標(biāo)簽前面時報錯
        Node shoujia = book2.getChildNodes().item(2);
        document.insertBefore(chubanshe, shoujia);
        
        // 回寫
        // 創(chuàng)建回寫類的工廠
        TransformerFactory transformerFactory =  TransformerFactory.newInstance();
        // 獲取回寫類
        Transformer transformer = transformerFactory.newTransformer();
        // 調(diào)用回寫的方法
        transformer.transform(new DOMSource(document), new StreamResult("src/book2.xml"));
    }
}

</blockquote>  
錯誤信息:

org.w3c.dom.DOMException: HIERARCHY_REQUEST_ERR: 嘗試在不允許的位置插入節(jié)點(diǎn)。
at com.sun.org.apache.xerces.internal.dom.CoreDocumentImpl.insertBefore(CoreDocumentImpl.java:396)
at cn.itcast.jaxp.JaxpDomTest.run2(JaxpDomTest.java:76)
at cn.itcast.jaxp.JaxpDomTest.main(JaxpDomTest.java:26)

利用錯誤信息中的關(guān)鍵詞定位到JDK_API中對應(yīng)的描述:

  • DOMException定位到類
DOMException類.png
  • HIERARCHY_REQUEST_ERR定位到該類下的字段摘要
HIERARCHY_REQUEST_ERR字段摘要.png
  • at com.sun.org.apache.xerces.internal.dom.CoreDocumentImpl.insertBefore定位到insertbefore方法
insertbefore方法.png
  • 再由insetBefore方法定位到兩個參數(shù)node節(jié)點(diǎn)對象是否正確,檢查后無誤
  • 最后檢測調(diào)用insetBefore方法的對象,發(fā)現(xiàn)錯誤原因:

查閱API可知,insetBefore方法的調(diào)用對象必須是添加之前的現(xiàn)有子節(jié)點(diǎn)的父節(jié)點(diǎn),而之前的代碼錯誤地調(diào)用對象document而不是book2,所以源代碼只需修改為
book2.insertBefore(chubanshe, shoujia);

  • 修改結(jié)果
修改成功結(jié)果.png

*特別注意:textNode的存在,即xml中空格部分也是作為一個子節(jié)點(diǎn)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容