2012-12-01 105 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