【问题标题】:return Object [] [] gives RuntimeException: Uncompilable source codereturn Object [] [] 给出 RuntimeException: 无法编译的源代码
【发布时间】:2013-06-23 10:20:04
【问题描述】:

我编写了一个方法,该方法将返回 Object[][] 以用作 JTable 的数据。我从 Microsoft Access 数据库中读取数据,然后将每条信息放入Object [][] 中的一个单元格中。我的问题是我的方法的返回语句,它给了我一个RuntimeException。当我使用System.out.println() 打印出对象的每个元素时,所有数据都在那里并且工作正常,但是当它返回该对象时,它就会失败。

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。

更新

堆栈跟踪:

线程“AWT-EventQueue-0”中的异常 java.lang.RuntimeException:无法编译的源代码 - 未报告的异常 java.sql.SQLException;必须被抓住或宣布被扔掉

【问题讨论】:

  • '返回它给我一个 NullPointerException' 没有意义。请显示堆栈跟踪
  • @IgorRodriguez 绝对不是。如果一个字符串(或一般的对象)为空并且您打印它,那么它将打印null,如果您尝试使用一个空对象,它将抛出一个NullPointerException,但是打印一个空对象不会抛出它
  • @user2513354 堆栈跟踪在哪里?
  • @user2513354 发布完整的堆栈跟踪。没有它我们只能猜测错误是什么,但我们不能确定你是否不发布堆栈跟踪
  • @user2513354 你为什么说NullPointerException?

标签: java arrays object nullpointerexception


【解决方案1】:

线程“AWT-EventQueue-0”中的异常 java.lang.RuntimeException:无法编译的源代码 - 未报告的异常 java.sql.SQLException;必须被抓住或宣布被抛出

这意味着您正在运行无法编译的代码。某些 IDE 允许这样做,例如 eclipse,在我看来这是一个非常糟糕的想法,因为这意味着您可以最大限度地提高查找和修复这些错误的成本。我建议您关闭此功能。

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


如果可以的话,我会写出非常不同的代码。打开和关闭数据库连接非常昂贵。您可以使用List&lt;String[]&gt; 来读取所有行,而不是假设有 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()][]);

    }
}

【讨论】:

  • 行数实际上可能是导致错误的原因。假设少于 24 个。
  • @Ingo 我想到了这一点,但我不希望 result.getString() 或 result.next() 抛出 NPE,SQLException 会更有意义。也许 OP 没有正确打印错误。
  • 嗯,其实是SQLException,OP写错了。
  • 他实际上并没有得到SQLException。他收到编译错误,因为他没有在某处捕获或声明 SQLException,然后他收到“无法编译的源代码”异常,因为他正在运行未完全编译的代码。
  • @sepp2k 谢谢,我已经更新了我的答案。令我惊讶的是,人们心甘情愿地把这个功能强加给自己。
【解决方案2】:

线程“AWT-EventQueue-0”中的异常 java.lang.RuntimeException:无法编译的源代码 - 未报告的异常 java.sql.SQLException;必须被抓住或宣布被抛出

此错误消息表明您正在运行一个部分编译的程序,而未能编译的部分这样做是因为它调用了一个可能引发SQLException 的方法,而没有捕获该异常或声明throws SQLException。由于给定的方法实际上确实声明了throws SQLException,我假设错误实际上是在不同的方法中(可能是调用这个方法的方法)。

请注意,此异常并不表示实际抛出了任何 SQLException - 只是表示它可能会被抛出并且您不考虑这种可能性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-08
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多