我有一个成功连接到我的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);
}
}
答案 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.
的更多信息