Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java XML file fail to write

Okay, I have a class createUser which is supposed to create an XML file to store data on a user. Problem is when I run it I'm getting this error

>        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)

which means it is incapable of transforming my doc into an xml file.

Here is the code it is from.

/*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();
        }
    }
}

If you don't want to take the time to trouble shoot it yourself or look it over that's fine but if you have and idea about how to troubleshoot transformer issues that would be fantastic. Because I'm having a hard time figuring out exactly what is causing this issue.

like image 628
jskady Avatar asked Dec 27 '22 13:12

jskady


1 Answers

Because that object is not valid XML or because the XML has an empty (null) text node.

It shows java.lang.NullPointerException

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

If you take a look at that you will see the code.To avoid this make sure that all the entries which you are getting from the user is not null, by

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

Also, can you check that the object is valid XML and that character entities, etc, are properly encoded.

like image 138
Bhavik Ambani Avatar answered Dec 29 '22 10:12

Bhavik Ambani