【问题标题】:Java XML file fail to writeJava XML 文件写入失败
【发布时间】:2012-11-19 07:38:01
【问题描述】:

好的,我有一个 createUser 类,它应该创建一个 XML 文件来存储用户的数据。问题是当我运行它时出现此错误

>        ERROR:  ''
>     javax.xml.transform.TransformerException: java.lang.NullPointerException
>         at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(Unknown
> Source)
>         at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(Unknown
> Source)
>         at CreateUser.makeUser(CreateUser.java:156)
>         at Welcomeclass.welcome(Welcomeclass.java:48)
>         at Welcomeclass.main(Welcomeclass.java:32)
>     Caused by: java.lang.NullPointerException
>         at com.sun.org.apache.xml.internal.serializer.ToUnknownStream.characters(Unknown
> Source)
>         at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(Unknown
> Source)
>         at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(Unknown
> Source)
>         at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(Unknown
> Source)
>         at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(Unknown
> Source)
>         at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(Unknown
> Source)
>         at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transformIdentity(Unknown
> Source)
>         ... 5 more
>     ---------
>     java.lang.NullPointerException
>         at com.sun.org.apache.xml.internal.serializer.ToUnknownStream.characters(Unknown
> Source)
>         at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(Unknown
> Source)
>         at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(Unknown
> Source)
>         at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(Unknown
> Source)
>         at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(Unknown
> Source)
>         at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(Unknown
> Source)
>         at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transformIdentity(Unknown
> Source)
>         at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(Unknown
> Source)
>         at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(Unknown
> Source)
>         at CreateUser.makeUser(CreateUser.java:156)
>         at Welcomeclass.welcome(Welcomeclass.java:48)
>         at Welcomeclass.main(Welcomeclass.java:32)

这意味着它无法将我的文档转换为 xml 文件。

这是它的代码。

/*imports*/
import java.util.Scanner;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

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

import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
/*A class to create a user object and store it in a XML file for later retrieval
public class CreateUser {   
    static Scanner input = new Scanner(System.in);

    /*objects note: must be strings due to being stored in XML table*/
    static String name;
    static String age;
    static String bday;
    static String gender;
    static String location;
    static String orientation;
    static String relationship;
    static String hobbies;
    static String choice;
    static String username;
    static String password;

    static String fileLocation = "C:/Users/Steven/Workspace/twitter/src/users.xml";

    int count = 0;
    int maxId = 0;
    static int nextId  = 0;

    public static void makeUser() throws SAXException, IOException {
        /*gets user input to fill String objects*/
        System.out.println("Hello, to register we will need some information about you.");
        System.out.println("What is your name?");
        name = input.nextLine();
        System.out.println("How old are you(e.g. 45)?");
        age = input.nextLine();
        System.out.println("When is your birthday(MM/DD/YYYY)?");
        bday = input.nextLine();
        System.out.println("What is your gender?");
        gender = input.nextLine();
        System.out.println("Where do you live?");
        location = input.nextLine();
        System.out.println("What is your orientation?");
        orientation = input.nextLine();
        System.out.println("Are you in a relationship? (y/n)");
        choice = input.nextLine();
        if(choice.equals("y"))
            relationship = "In a relationship.";
        if(choice.equals("y"))  
            relationship = "Single.";
        System.out.println("What are your hobbies?");
        hobbies = input.nextLine();
        System.out.println("What will be your username?");
        username = input.nextLine();
        System.out.println("What will be your password?");
        password = input.nextLine();    

        /*create XML file to store the data*/
        try{
            DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
            Document userslist = docBuilder.newDocument();
            /*create user element*/
            Element users = userslist.createElement("users");
            userslist.appendChild(users);

            Element user = userslist.createElement("user");
            users.appendChild(user);

            /*get the max id to set the next id if the file exists*/
            File xmlFile = new File(fileLocation);
            if(xmlFile.exists())
            {
                DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
                DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
                Document idgetter = dBuilder.parse(xmlFile);
                idgetter.getDocumentElement().normalize();
                NodeList nodes = idgetter.getElementsByTagName("id");
                int maxId = 0;
                for(int i = 0; i < nodes.getLength(); i++){
                    if(Integer.parseInt(nodes.item(i).getTextContent()) > maxId )
                    {
                        maxId = Integer.parseInt(nodes.item(i).getTextContent());
                    }
                }
                nextId = maxId +1;
            }
            /*else create the file*/
            else
            {
                /*create the id attribute*/
                Attr attr = userslist.createAttribute("id");
                attr.setValue(String.valueOf(nextId));
                user.setAttributeNode(attr);

                /*fill in doc with objects*/
                Element dname = userslist.createElement("name");
                dname.appendChild(userslist.createTextNode(name));
                user.appendChild(dname);
                Element dgender = userslist.createElement("gender");
                dgender.appendChild(userslist.createTextNode(gender));
                user.appendChild(dgender);
                Element dlocation = userslist.createElement("location");
                dlocation.appendChild(userslist.createTextNode(location));
                user.appendChild(dlocation);
                Element dorientation = userslist.createElement("orientation");
                dorientation.appendChild(userslist.createTextNode(orientation));
                user.appendChild(dorientation);
                Element drelationship = userslist.createElement("relationship");
                drelationship.appendChild(userslist.createTextNode(relationship));
                user.appendChild(drelationship);
                Element dhobbies = userslist.createElement("hobbies");
                dhobbies.appendChild(userslist.createTextNode(hobbies));
                user.appendChild(dhobbies);
                Element dchoice = userslist.createElement("choice");
                dchoice.appendChild(userslist.createTextNode(choice));
                user.appendChild(dchoice);
                Element dusername = userslist.createElement("username");
                dusername.appendChild(userslist.createTextNode(username));
                user.appendChild(dusername);
                Element dpassword = userslist.createElement("password");
                dpassword.appendChild(userslist.createTextNode(password));
                user.appendChild(dpassword);
                Element dbday = userslist.createElement("birthday");
                dbday.appendChild(userslist.createTextNode(bday));
                user.appendChild(dbday);
                Element dage = userslist.createElement("age");
                dage.appendChild(userslist.createTextNode(age));
                user.appendChild(dage);

                /*transfer document to XML*/
                TransformerFactory transformerFactory = TransformerFactory.newInstance();
                Transformer transformer = transformerFactory.newTransformer();
                DOMSource source = new DOMSource(users);

                /*create the document in append mode */
                //StreamResult result = new StreamResult(new FileWriter(fileLocation, true));
                StreamResult result = new StreamResult(System.out);

                transformer.transform(source, result);
            }
        } catch (ParserConfigurationException pce) {
            pce.printStackTrace();
        } catch (TransformerException tfe) {
            tfe.printStackTrace();
        }
    }
}

如果您不想花时间自己排除故障或查看它,那很好,但如果您知道如何解决变压器问题,那就太好了。因为我很难弄清楚到底是什么导致了这个问题。

【问题讨论】:

    标签: java xml file nullpointerexception transformer


    【解决方案1】:

    因为该对象不是有效的 XML,或者因为 XML 有一个空(null)文本节点。

    显示java.lang.NullPointerException

    at com.sun.org.apache.xml.internal.serializer.ToUnknownStream.characters(Unknown
    > Source)
    

    如果你看一下你会看到代码。为避免这种情况,请确保你从用户那里获得的所有条目都不为空,通过

    int length = readValue.length();
    if (length == 0){
      throw new NullPointerException("Node value can not be null");
    }
    

    另外,您能否检查该对象是有效的 XML 以及字符实体等是否正确编码。

    【讨论】:

    • 谢谢,我意识到这是因为传入了空值
    • 不正确。传入的空值被转换为空字符串,这很好。我已经为你调试了代码。看我的回答。
    【解决方案2】:

    当为关系问题输入 y 以外的其他内容时,您会得到 NullPointerException

        if (choice.equals("y"))
            relationship = "In a relationship.";
        if (choice.equals("y"))
            relationship = "Single.";
    

    快速解决方法是为字段 relationship 设置默认值

    if ("y".equals(choice)) {
        relationship = "In a relationship.";
    else {
        relationship = "Single.";
    }
    

    【讨论】:

    • 是的,谢谢,这是我在查看 Bhavik 的建议后意识到的。我这样做是为了让用户不再能够输入除 Y 或 N 之外的任何内容,否则它会重新提出问题。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多