数据库不喜欢从循环中读取值

时间:2013-11-27 22:04:22

标签: java

我有一个成功连接到我的java代码的java数据库。这一切都很好,因为它的工作和所有。

当我将数据库中的结果存储到变量中时......它运行正常。

现在因为我必须这样做8次我使用了一个循环和一个数组但是通过使用try catch工具它给出了一个错误,错误是:java.lang.NullPointerException

进一步的调查表明它似乎不喜欢循环奇怪。

public String Title []; //in class but out of any methods
    public void gettinginfo ()
    {
        try
        {
            int AB = 0;  //array base starts from 0
            //ID in database starts from 1
            for (int i = 1; i<=8; i++)
            {
                String query = "SELECT * FROM students WHERE ID = " + i;
                Rs = St.executeQuery(query);
                while (Rs.next())
                {   
                    Title[AB] = Rs.getString("StudentName");
                    AB++;

                }
            }
        }
        catch (Exception ex)
        {
            System.out.println("Error is: " + ex);
        }
    }

3 个答案:

答案 0 :(得分:1)

您的NullPointerException发生在哪一行?可能您的Title数组尚未初始化。如果您知道查询将返回多少行,您可以说:

Title = new String[numRows];

但如果不这样做,则需要运行SELECT count(*) ...查询或使用ArrayList或其他可调整大小的列表,而不是数组。


您的代码结构也非常糟糕,这也是调试此问题的原因所在。我已经清理了下面的代码,其中的评论解释了我的更改:

public class YourClass
{
  private static final int MAX_ID = 8; // or however you want to set the size
  private String[] title; // [] after the type is easier to read, lower case variables
  private Connection conn; // I'm assuming the class will be provided a DB connection
  // Note the Statement and ResultSet objects are not defined in the class, to
  // minimize their scope.

  public void queryInfo() // name suggests a query (potentially expensive) will be run
  {
    title = new String[MAX_ID]; // **initialize title**
    // We use a try-with-resources block to ensure the statement is safely closed
    // even better would be to use a PreparedStatement here
    try(Statement st = conn.statement())
    {
      // You're executing 8 separate queries here, where one will do
      String query = "SELECT * FROM students WHERE ID >= 1 AND ID <= "+MAX_ID;
      // Again, we need to close the result set when we're done
      try(ResultSet rs = st.executeQuery(query))
      {
        int i = 0;
        while (rs.next())
        {   
          title[i++] = rs.getString("StudentName");
        }
      } // close our ResultSet
    } // close our Statement
  }

  // provide a separate getter method, rather than making the array public
  public String[] getTitles()
  {
    return title;
  }
}

还有更多可以改进的地方 - 使用数组似乎是一个糟糕的设计,调用填充类变量的方法而不是简单地让queryInfo()返回一个新数组。您还可以查看使用PreparedStatement。希望这些建议有所帮助。

答案 1 :(得分:0)

确保Title数组和Statement St对象为空且不为空。这是我怀疑的唯一两个原因。如果它不起作用,请提供完整的堆栈跟踪。

Title数组为NULL。 “new”这个数组的大小等于行数。如果您不知道行,请触发count(*) query first,找出行数,然后对Title数组进行实例化,或使用ArrayList<String>代替String数组。

答案 2 :(得分:0)

我假设你没有初始化你的Title数组,你必须将它设置为等于或者只是为null会导致nullPointerException,但正如其他人所说的那样,因为你的避风港而无法确定#39;给我们一个完整的堆栈跟踪甚至是异常的行号。在这种情况下,异常应该这样处理:

try{
    //your code here
}catch(Exception ex){
    ex.printStackTrace();
}

此代码将为您提供完整的堆栈跟踪,以便更轻松地跟踪问题。 您也可以考虑使用ArrayList而不是数组:

List<String> Title = new ArrayList<String>();

然后添加到它:

Title.add(Rs.getString("StudentName"));

如果您以后需要它作为数组:

String[] title = Title.toArray(new String[Title.size()]);

您可以阅读有关ArrayLists here.

的更多信息