繁体   English   中英

Java XML文件无法写入

[英]Java XML file fail to write

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

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

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

如果为关系问题输入了除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.";
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM