2012-12-01 56 views
3

好的,我有一个createUser类,它应该创建一个XML文件来存储用户数据。问题是,当我运行它,我得到这个错误Java 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(); 
     } 
    } 
} 

如果你不想花时间去排查它自己或看它在这很好,但如果你已经和有关如何解决问题的变压器,将是非常美妙的想法。因为我很难搞清楚究竟是什么导致了这个问题。

回答

3

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

是的,谢谢这是我看过Bhavik的建议后意识到的。我做到了,所以用户不再能够输入除Y或N之外的任何内容,否则它会重新提问。非常感谢! – jskady

5

由于该对象不是有效的XML或XML具有空(空)文本节点。

它显示java.lang.NullPointerException

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

如果你看一看,你会看到code.To避免这种情况,确保所有你是从用户得到的条目不为空,由

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

此外,你可以检查对象是否有效的XML和字符实体等正确编码。

+0

谢谢呀,我意识到,这是因为在 – jskady

+0

欢迎好友传递空值:) –

+0

这是不正确的。传入的空值被转换为空字符串,这很好。我已经为您调试了代码。看到我的答案。 – Synesso