-1

I have been trying to create an XML document, but keep getting a Null Pointer Exception error, and I have spent several hours trying to figure out why.

The path is correct because it works when reading the file.

Main:

    public static final String PATH = "res/config.xml";

public Main() {

}
public static void main(String args[]) throws FileNotFoundException {
    new WriteConfig(PATH);
}

WriteConfig:

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
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.Document;
import org.w3c.dom.Element;

public class WriteConfig {
Document dom;
Element e = null;
String name;
String gender;
String race;
String cclass;

public WriteConfig(String xml) {
    DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();       
    try {
        DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
        dom = docBuilder.newDocument();
        Element mainRootElement = dom.createElement("character");

        e = dom.createElement("name");
        e.appendChild(dom.createTextNode(name));
        mainRootElement.appendChild(e);

        e = dom.createElement("gender");
        e.appendChild(dom.createTextNode(gender));
        mainRootElement.appendChild(e);

        e = dom.createElement("race");
        e.appendChild(dom.createTextNode(race));
        mainRootElement.appendChild(e);

        dom.appendChild(mainRootElement);

        try {
            Transformer tr = TransformerFactory.newInstance().newTransformer();
            tr.setOutputProperty(OutputKeys.INDENT, "yes");
            tr.setOutputProperty(OutputKeys.METHOD, "xml");
            tr.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
            tr.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "res/config.dtd");
            tr.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
            DOMSource dSource = new DOMSource(dom);
            StreamResult sResult = new StreamResult(xml);
            tr.transform(dSource, sResult);
        } catch (TransformerException te) {
            te.printStackTrace();
        } 
    } catch (ParserConfigurationException pce) {
        pce.printStackTrace();
    }
   }
 }

Error:

    ERROR:  ''
javax.xml.transform.TransformerException: java.lang.NullPointerException
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:752)
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:357)
    at bamberger.com.engine.WriteConfig.<init>(WriteConfig.java:64)
    at bamberger.com.engine.Main.main(Main.java:13)
Caused by: java.lang.NullPointerException
    at com.sun.org.apache.xml.internal.serializer.ToStream.characters(ToStream.java:1612)
    at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:244)
    at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:230)
    at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:230)
    at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:136)
    at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:98)
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transformIdentity(TransformerImpl.java:699)
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:743)
    ... 3 more
---------
java.lang.NullPointerException
    at com.sun.org.apache.xml.internal.serializer.ToStream.characters(ToStream.java:1612)
    at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:244)
    at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:230)
    at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:230)
    at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:136)
    at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:98)
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transformIdentity(TransformerImpl.java:699)
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:743)
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:357)
    at bamberger.com.engine.WriteConfig.<init>(WriteConfig.java:64)
    at bamberger.com.engine.Main.main(Main.java:13)

WriteConfig.java:64

tr.transform(dSource, sResult);

Thanks!

EwokHugz
  • 353
  • 2
  • 8
  • 15
  • 3
    have spent several hours => And you don't used a debugger to see where is the null? I think you have just wasted your time :/ – Marco Acierno Aug 09 '14 at 01:42
  • 1
    It is bad style to implement processing in the constructor. Besides, if you talk about Exceptions, show the exception and map the line numbers. In your sample code all strings are null. – eckes Aug 09 '14 at 01:44
  • 2
    Check this out: [What is a NullPointerException, and how can I fix it?](http://stackoverflow.com/questions/218384/what-is-a-null-pointer-exception-and-how-do-i-fix-it) If that doesn't help, post the error. It'll make it easier to distinguish the problem in the code – Vince Aug 09 '14 at 01:44
  • I know what a NullPointerException is, but I still cannot figure out what is wrong with this code. I posted the error message – EwokHugz Aug 09 '14 at 01:52

2 Answers2

1

You never initialized String name; in WriteConfig before trying to use it for e.appendChild(dom.createTextNode(name));. Initialize the name variable to fix the error.

Vince
  • 14,470
  • 7
  • 39
  • 84
  • _bangs head against keyboard._ Thank you so much. I cannot believe I missed that. I was planning to get those strings through another method once I got the code working, and I just forgot to initialize them – EwokHugz Aug 09 '14 at 02:02
  • We've all been there :P Next time, use `System.out.println(name);` to check if a variable is null. Any variable that is not primitive can be null – Vince Aug 09 '14 at 02:05
0
String name;
String gender;
String race;
String cclass;

must be initialize variable before use it.

         //Decarle variable
        String name;
        String gender;
        String race;
        String cclass;


        //Initialize and set value
        name = "EwokHugz";
        gender = "female";
        race = "10";
        cclass = "XML Programming";
iCrazybest
  • 2,935
  • 2
  • 24
  • 24