2014-11-08 150 views
1

看來我正在處理的函數有問題。我用JDBC和代碼如下:嘗試使用jdbc時發生java.lang.NullPointerException

public String[] getAllFoodOrders() throws Exception{ 
      String[] foodordersstringarray = null; 
      byte i = 0; 

      Statement myStmt = null; 
      ResultSet myRs = null; 

      try { 
       myStmt = myConn.createStatement(); 
       myRs = myStmt.executeQuery("SELECT description FROM orders,menu WHERE code = menu_CODE"); 

       while (myRs.next()) { 
        foodordersstringarray[i++] = myRs.getString("description"); 
       } 
      } 
       finally{ 
         close(myStmt, myRs); 
         } 

      return foodordersstringarray; 
     } 

例外是在該行中,while語句中拋出:

「foodordersstringarray [I ++] = myRs.getString(」 描述 「);」

包含上述方法的整個類的代碼如下:

/* 
* To change this license header, choose License Headers in Project Properties. 
* To change this template file, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package MySQLDatabaseManagement; 

import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.sql.Connection; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 

/** 
* 
* @author localhost 
*/ 
public class AdminExportToPDFOrXMLSQLManagement { 
     private final Connection myConn; 

    public AdminExportToPDFOrXMLSQLManagement() throws SQLException,FileNotFoundException,IOException{ 

      //partea cu conexiunea tabelului 
      myConn = ConnectToDatabase.getConnection(); 
      //partea cu conexiunea la tabel 
    } 
     public String[] getAllFoodOrders() throws Exception{ 
      String[] foodordersstringarray = null; 
      byte i = 0; 

      Statement myStmt = null; 
      ResultSet myRs = null; 

      try { 
       myStmt = myConn.createStatement(); 
       myRs = myStmt.executeQuery("SELECT description FROM orders,menu WHERE code = menu_CODE"); 

       while (myRs.next()) { 
        foodordersstringarray[i++] = myRs.getString("description"); 
       } 
      } 
       finally{ 
         close(myStmt, myRs); 
         } 

      return foodordersstringarray; 
     } 

    private static void close(Connection myConn, Statement myStmt, ResultSet myRs) throws SQLException { 

     if (myRs != null) { 
      myRs.close(); 
     } 
     if (myConn != null) { 
      myConn.close(); 
     } 
    } 

    private void close(Statement myStmt, ResultSet myRs) throws SQLException { 
     close(null, myStmt, myRs);  
    } 
} 

堆棧跟蹤如下:

java.lang.NullPointerException 
    at MySQLDatabaseManagement.AdminExportToPDFOrXMLSQLManagement.getAllFoodOrders(AdminExportToPDFOrXMLSQLManagement.java:40) 
    at xml.MySAXWriter.<init>(MySAXWriter.java:26) 
    at Listeners.AdminExportToPDFOrXMListener.ExportToXML(AdminExportToPDFOrXMListener.java:35) 
    at Listeners.AdminExportToPDFOrXMListener.actionPerformed(AdminExportToPDFOrXMListener.java:54) 
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022) 
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2346) 
    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:6525) 
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3322) 
    at java.awt.Component.processEvent(Component.java:6290) 
    at java.awt.Container.processEvent(Container.java:2234) 
    at java.awt.Component.dispatchEventImpl(Component.java:4881) 
    at java.awt.Container.dispatchEventImpl(Container.java:2292) 
    at java.awt.Component.dispatchEvent(Component.java:4703) 
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4898) 
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4533) 
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4462) 
    at java.awt.Container.dispatchEventImpl(Container.java:2278) 
    at java.awt.Window.dispatchEventImpl(Window.java:2739) 
    at java.awt.Component.dispatchEvent(Component.java:4703) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:751) 
    at java.awt.EventQueue.access$500(EventQueue.java:97) 
    at java.awt.EventQueue$3.run(EventQueue.java:702) 
    at java.awt.EventQueue$3.run(EventQueue.java:696) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86) 
    at java.awt.EventQueue$4.run(EventQueue.java:724) 
    at java.awt.EventQueue$4.run(EventQueue.java:722) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:721) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82) 

您能告訴什麼是我做錯了嗎? 提前謝謝!

回答

1

數組foodordersstringarray未初始化。它應該創建一定的大小。如果您不知道大小,以指定,填寫List結果,然後轉換List到一個數組:

List<String> foodorderList = new ArrayList<String>(); 
... 

try { 
    myStmt = myConn.createStatement(); 
    myRs = myStmt.executeQuery("SELECT description FROM orders,menu WHERE code = menu_CODE"); 

    while (myRs.next()) { 
     foodorderList.add(myRs.getString("description")); 
    } 
} 
finally{ 
    close(myStmt, myRs); 
} 
return foodorderList.toArray(new String[1]); 
+1

正確答案。順便說一下,'數組foodorderstringarray沒有初始化' - 它***被***初始化爲'null'。 – BackSlash 2014-11-08 15:43:59

+0

我很抱歉問這個問題。 :( – Andrei 2014-11-08 15:48:18

+0

@Andrei別擔心 – 2014-11-08 15:50:14

0

您String數組爲空,如下因此空指針異常。

String[] foodordersstringarray = null; 

如果你確定我會得到1000說或更少的記錄使用它像:

String[] foodordersstringarray = new String[1000]; 

這裏有內存浪費的機會。

List<String> foodOrderList = new LinkedList<String>(); 

,取而代之的:我會用列表在這裏而不是陣列像下面建議你

foodordersstringarray[i++] = myRs.getString("description"); 

foodOrderList.add(myRs.getString("description")); 

,並在方法結束時,你可以做

return (String[]) foodOrderList.toArray();//will return Object[] 
相關問題