2013-10-29 105 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

相关问题