2013-06-23 30 views
-2

我寫了一個方法,它將返回一個Object[][]作爲JTable的數據。我從Microsoft Access數據庫讀取數據,然後將每條信息放入Object [][]中的單元格中。我的問題是我的方法返回聲明,它給了我一個RuntimeException。當我使用一個System.out.println()打印出對象的每個元素時,所有的數據都在那裏,並且工作正常,但是當它返回到那個對象時,它就會通過。return Object [] []給出RuntimeException:不可編譯的源代碼

public Object [] [] AllWorldBestTimes() throws SQLException 
{ 
    DatabaseConnection connection = new DatabaseConnection(); 

    ResultSet result = connection.SelectStatements("SELECT * FROM WorldBestTimes"); 

    count = 24; 

    Object [] [] data = new String[count][4];  

    int row = 0; 

    while(row < count) 
    { 
     data [row][0] = result.getString(1); 
     data [row][1] = result.getString(2); 
     data [row][2] = result.getString(3); 
     data [row][3] = result.getString(4); 
     result.next(); 

     System.out.println(data [row][0]); 
     System.out.println(data [row][1]); 
     System.out.println(data [row][2]); 
     System.out.println(data [row][3]); 

     row++; 
    } 

    connection.close(); 

    return data; 
} 

上面的代碼顯示時,它被打印出來,但它返回給我一個RuntimeException要返回需要的精確的數據。

UPDATE

堆棧跟蹤:

在異常線程 「AWT-EventQueue的-0」 了java.lang.RuntimeException:不可編譯的源代碼 - 未報告異常java.sql.SQLException中;必須捕獲或聲明被拋出

+1

'返回它給了我一個NullPointerException'沒有意義。請顯示堆棧跟蹤 – home

+0

返回它?或者,當打印出這些數據? –

+0

也許試着追加''「'String或者檢查getString()是否爲'null',這樣你就可以自己拋出NPE了? – tkroman

回答

4

在異常線程 「AWT-EventQueue的-0」 了java.lang.RuntimeException:不可編譯的源代碼 - 未報告異常java.sql.SQLException中;必須被捕獲或被宣告爲拋出

這意味着你正在運行的代碼不能編譯。有些IDE允許這樣的,比如eclipse,在我看來這是一個非常糟糕的IDEA,因爲它意味着你可以最大限度地發現和修復這些錯誤。我建議你關閉這個功能。

java.lang.RuntimeException: Uncompilable source code - what can cause this?


我會寫這樣的代碼,如果你能非常不同。打開和關閉數據庫連接非常昂貴。您可以使用List<String[]>閱讀,而不是假設所有行有24

public String[][] AllWorldBestTimes() throws SQLException { 
    return select("SELECT * FROM WorldBestTimes"); 
} 

public String[][] select(String selectSQL) throws SQLException { 
    // TODO use a connection pool instead. 
    Connection connection = new DatabaseConnection(); 
    List<String[]> data; 
    PreparedStatement statement = null; 
    ResultSet result = null; 
    try { 
     statement = connection.prepareStatement(selectSQL); 
     result = statement.executeQuery(); 
     data = new ArrayList<String[]>(); 
     int columnCount = result.getMetaData().getColumnCount(); 
     while (result.next()) { 
      String[] row = new String[columnCount]; 
      for (int i = 0; i < columnCount; i++) 
       row[i] = result.getString(i + 1); 
      data.add(row); 
     } 
    } finally { 
     if (result != null) { 
      result.close(); 
     } 
     if (statement != null) { 
      statement.close(); 
     } 
     connection.close(); 
    } 
    return data.toArray(new String[data.size()][]); 

    } 
} 
+0

行數實際上可能是錯誤的原因。假設小於24. – Ingo

+0

@Ingo我想到了這一點,但我不希望result.getString()或result.next()拋出NPE,但SQLException會更有意義。也許OP不能正確打印錯誤。 –

+1

那麼,實際上這是一個SQLException,OP寫錯了。 – BackSlash

2

異常在線程「AWT-EventQueue的 - 0」了java.lang.RuntimeException:不可編譯的源代碼 - 沒有報告異常的Java。 sql.SQLException;必須捕獲或聲明拋出

此錯誤消息表明您運行的是部分編譯的程序,並未能編譯的一部分,這樣做是因爲它被稱爲可能會引發SQLException沒有任何醒目的是一個方法例外或宣佈throws SQLException。由於給定的方法實際上聲明throws SQLException,我假設這個錯誤實際上是在一個不同的方法中(可能是調用這個方法的那個方法)。

請注意,這種情況並不表示任何SQLException實際上是拋出的 - 只是它可能被拋出,並且您沒有考慮到這種可能性。