2013-10-29 208 views
0

我真的不知道還能做什麼,我搜索了每個地方,嘗試了任何東西,但無法解決我的問題。我創建了一個neo4j圖形數據庫,並通過localhost:7474(可視化)在節點的name屬性上創建了一個索引,現在我想通過搜索其名稱屬性索引來獲取節點號,但是我得到了nullpointerexception錯誤,我知道這是因爲存在空值,我知道這是從哪裏來的,但我無法解決它。我該如何解決我的NullPointerException?

這是代碼:

package graph_traversing; 

import org.neo4j.graphdb.GraphDatabaseService; 
import org.neo4j.graphdb.factory.GraphDatabaseFactory; 
import org.neo4j.graphdb.index.Index; 
import org.neo4j.graphdb.Node; 
import org.neo4j.graphdb.Relationship; 
import org.neo4j.graphdb.RelationshipType; 
import org.neo4j.graphdb.Transaction; 
import org.neo4j.graphdb.index.IndexHits; 
import org.neo4j.graphdb.index.IndexManager; 

public class search_string extends javax.swing.JFrame 
{ 


    public search_string() {initComponents(); } 
    @SuppressWarnings("unchecked") 

private static enum RelTypes implements RelationshipType 
{ 
    INCLUDES 
} 

    private static final String DB_PATH = "C:\\Users\\fereshteh\\Downloads\\Compressed\\neo4j-community-1.9.4\\DB"; 
    GraphDatabaseService db = new GraphDatabaseFactory().newEmbeddedDatabase(DB_PATH); 
IndexManager nodeindex = db.index(); 
Index<Node> names = nodeindex.forNodes("name"); 

    String [] str; 
    Node [] nodes;Relationship rel; 
    IndexHits<Node> hits; 

    String find; 
    // <editor-fold defaultstate="collapsed" desc="Generated Code">       
    private void initComponents() { 

     jLabel1 = new javax.swing.JLabel(); 
     search_txb = new javax.swing.JTextField(); 
     search_btn = new javax.swing.JButton(); 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

     jLabel1.setText(" Enter The Word Please"); 

     search_btn.setText("Search"); 
     search_btn.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       search_btnActionPerformed(evt); 
      } 
     }); 

     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addGap(46, 46, 46) 
       .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
        .addComponent(search_btn) 
        .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 147, javax.swing.GroupLayout.PREFERRED_SIZE) 
        .addComponent(search_txb, javax.swing.GroupLayout.PREFERRED_SIZE, 289, javax.swing.GroupLayout.PREFERRED_SIZE)) 
       .addContainerGap(65, Short.MAX_VALUE)) 
     ); 
     layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addGap(38, 38, 38) 
       .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 36, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addGap(39, 39, 39) 
       .addComponent(search_txb, javax.swing.GroupLayout.PREFERRED_SIZE, 43, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 71, Short.MAX_VALUE) 
       .addComponent(search_btn) 
       .addGap(50, 50, 50)) 
     ); 

     pack(); 
    }// </editor-fold>       

    private void search_btnActionPerformed(java.awt.event.ActionEvent evt) {           

     str=search_txb.getText().split(" "); 

     for(int i=0;i<str.length;++i) 
     { 
      find=str[i]; 
      hits = names.get("name", find); 
      System.out.println(hits); 
      nodes [i] = hits.getSingle(); 
      // nodes [i]= nodeIndex.get("name", find).getSingle(); 
      System.out.println(nodes[i]); 
     } 
     String s ="hi"; 
     for(int i=0;i<nodes.length;++i) 
     { 
     rel= (Relationship) nodes[i].getRelationships(); 
     for(int j=i+1;j<nodes.length;++j) 
     { 
      s=rel.toString(); 

     } 
     } 
    System.out.println(s); 

    }           


    public static void main(String args[]) 
    { 

     java.awt.EventQueue.invokeLater(new Runnable() {public void run() {new search_string().setVisible(true);} }); 




    } 
    // Variables declaration - do not modify      
    private javax.swing.JLabel jLabel1; 
    private javax.swing.JButton search_btn; 
    private javax.swing.JTextField search_txb; 
    // End of variables declaration     
} 

錯誤首先屬於這一行:nodes [i] = hits.getSingle();

我已經改變了它,並hits = names.get("name", find);這麼多的其他代碼,但總是出現錯誤。

,這是錯誤:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
    at graph_traversing.search_string.search_btnActionPerformed(search_string.java:90) 
    at graph_traversing.search_string.access$000(search_string.java:14) 
    at graph_traversing.search_string$1.actionPerformed(search_string.java:50) 
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018) 
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341) 
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) 
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) 
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) 
    at java.awt.Component.processMouseEvent(Component.java:6505) 
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3320) 
    at java.awt.Component.processEvent(Component.java:6270) 
    at java.awt.Container.processEvent(Container.java:2229) 
    at java.awt.Component.dispatchEventImpl(Component.java:4861) 
    at java.awt.Container.dispatchEventImpl(Container.java:2287) 
    at java.awt.Component.dispatchEvent(Component.java:4687) 
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832) 
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492) 
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422) 
    at java.awt.Container.dispatchEventImpl(Container.java:2273) 
    at java.awt.Window.dispatchEventImpl(Window.java:2719) 
    at java.awt.Component.dispatchEvent(Component.java:4687) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735) 
    at java.awt.EventQueue.access$200(EventQueue.java:103) 
    at java.awt.EventQueue$3.run(EventQueue.java:694) 
    at java.awt.EventQueue$3.run(EventQueue.java:692) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87) 
    at java.awt.EventQueue$4.run(EventQueue.java:708) 
    at java.awt.EventQueue$4.run(EventQueue.java:706) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:705) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:91) 

我已經把System.out.println(hits);理解命中是否爲空或不是,但我在輸出命中看到有[email protected]值。(這個正確的輸出我希望得到什麼?節點)。

這是java api,如果你幫我,這真的會真的很好,我有頭暈。

+2

許多對象不具有很大的toString()方法,不會隱給你你想要的的println(...)輸出。調用System.out.println(hits.currentScore())在命中變量時,特別是如果有要打印的變量,或者您必須編寫自定義的printGraph(...)方法,該方法通過hits.next()並打印每個。 – SpacePrez

+0

謝謝,好點。 – fereshteh

+0

爲了可讀性請始終縮進您的代碼。我解決了你的(幾乎)[相同的問題] 13小時前(http://stackoverflow.com/questions/19637017/how-to-solve-exception-in-thread-awt-eventqueue-0-java-lang-nullpointerexcepti) 。如果您覺得必須再次發佈相同的問題,則應考慮將更正後的縮進與:更可讀的問題,更有可能得到準確的幫助。 – jjaderberg

回答

3

它看起來像你沒有初始化任何東西nodes。您正嘗試訪問null索引inodes[i]空指針。

認爲你想要做什麼是你search_btnActionPerformed方法來初始化nodes,像...

private void search_btnActionPerformed(java.awt.event.ActionEvent evt) {           
    str=search_txb.getText().split(" "); 
    // initialize nodes to a new array with the same size as str 
    nodes = new Node[str.length]; 
    for(int i=0;i<str.length;++i) 
    ...... 

} 
+0

非常感謝,救命。 – fereshteh

+0

@ user2841094如果它解決了您的問題,您應該接受答案 – RaduK

+0

感謝您的接受!很高興我能幫上忙。 – Shaded

1
hits = names.get("name", find); 

可以返回null。你需要檢查,否則保證它不會爲空。也許你傳遞的字符串不正確(你確定「name」是一個節點嗎?)。也就是說,如果它可能爲空,你應該檢查null;只有在值爲空時纔會打印。否則,你可以拋出一個異常或打印錯誤或再試一次:

if(hits != null){ 
      System.out.println(hits); 
      nodes [i] = hits.getSingle(); 
      if(nodes[i] != null){ 
        System.out.println(nodes[i]); 
      } 
    } 
else{ 
    System.out.println("'name' not found); 
} 
+0

請問,名稱不是節點,它是被索引的屬性。 – fereshteh

+0

非常感謝,挽救生命。 – fereshteh

相關問題