Java XML文件无法写入

时间:2012-12-01 03:41:39

标签: java xml file nullpointerexception transformer

好的,我有一个类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)

这意味着它无法将我的doc转换为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();
        }
    }
}

如果你不想花时间自己麻烦拍摄,或者仔细研究它,但如果你有关于如何排除变压器问题的想法那就太棒了。因为我很难弄清楚究竟是什么导致了这个问题。

2 个答案:

答案 0 :(得分:5)

因为该对象不是有效的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,以及字符实体等是否已正确编码。

答案 1 :(得分:3)

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

    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.";
}