[英]JDBC + ScriptRunner : java.lang.NullPointerException
[英]JDBC: java.lang.NullPointerException
我试图从MySQL数据库读取记录,并将其放在JDBC中的类变量中,但是它引发异常The Error is: java.lang. NullPointerException
The Error is: java.lang. NullPointerException
。
我在这里做错了什么?
try {
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/databasename", "root", "password");
st = conn.createStatement();
rs = st.executeQuery("SELECT * FROM tablename");
kids records = new kids();
int i = 0;
while (rs.next()) {
records.id[i] = rs.getInt("id");
records.name[i] = rs.getString("name");
records.user_id[i] = rs.getInt("user_id");
System.out.println("id: " + records.id[i] + "name: " + records.name[i] + "user_id" + records.user_id[i]);
i++;
}
} catch (Exception e) {
System.err.println("The Error: " + e);
}
应该存储记录的kid类如下。
public class kids{
public int id[];
public String name[];
public int user_id[];
public kids(){
for (int x=0;x<100;x++){
this.id[x]=0;
this.name[x]="";
this.user_id[x]=0;
}
}
}
问题在于您的kids
类中的数组为null
因为这是对象的默认值(数组是一个对象)。 您应该在类构造函数中对其进行初始化:
private static final int MAX_ARRAY = 100;
public kids(){
this.id = new int[MAX_ARRAY];
this.name = new String[MAX_ARRAY];
this.user_id= new int[MAX_ARRAY];
for (int x=0; x<MAX_ARRAY; x++){
this.id[x]=0;
this.name[x]="";
this.user_id[x]=0;
}
}
您当前的设计还有其他一些问题需要解决:
kids
重命名为Kid
,将您的可变kids records
重命名为Kid kid
,然后... kid
类当前正在存储数据的并行数组。 有一个具有int id; String name; int user_id;
的Kid
类会更好int id; String name; int user_id;
int id; String name; int user_id;
字段和包含一个Kid[] kidHolder
KidHolder
类。 List
。 考虑到所有这些建议,您的设计应如下所示:
public class Kid {
private int id;
private String name;
private int userId;
//getters and setters
}
public class KidHolder {
private List<Kid> kidHolder;
public KidHolder() {
kidHolder = new ArrayList<Kid>();
}
public void add(Kid kid) {
}
}
//...
List<Kid> kidList = new ArrayList<Kid>();
try {
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/databasename", "root", "password");
st = conn.createStatement();
rs = st.executeQuery("SELECT * FROM tablename");
//kids records = new kids();
//int i = 0;
while (rs.next()) {
Kid kid = new Kid();
//records.id[i] = rs.getInt("id");
//records.name[i] = rs.getString("name");
//records.user_id[i] = rs.getInt("user_id");
kid.setId(rs.getInt("id"));
kid.setName(rs.getInt("name"));
kid.setUserId(rs.getInt("user_id"));
System.out.println("id: " + kid.getId() + "name: " + kid.getName() + "user_id" + kid.getUserId());
kidList.add(kid);
}
} catch (Exception e) {
System.err.println("The Error: " + e);
} finally {
closeResource(rs);
closeResource(st);
closeResource(conn);
}
//probably you should return kidList to display it in your view
//method to close the connection
//create two more similar methods to close ResultSet and Statement...
public void closeResource(Connection con) {
if (con != null) {
try {
con.close();
} catch (SQLException silent) {
//...
}
}
}
您尚未实例化任何成员,
public int id[];
public String name[];
public int user_id[];
甚至构造函数也会在this.id[x]=0;
处失败this.id[x]=0;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.