繁体   English   中英

JDBC: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;
    }
}

您当前的设计还有其他一些问题需要解决:

  • 使用Java代码约定 ,因此将您的类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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM