预准备语句中的空指针异常

时间:2018-09-20 02:33:07

标签: java mysql sql jdbc nullpointerexception

在尝试从我的sql服务器获取数据时遇到了一个问题,在那里他们在准备好的语句中给出了空点异常。我确定这肯定是一个菜鸟问题,但请提供帮助:)

这是我正在调用的方法

public void notification(){
    int MachCode = 1721;
    try{
        String sql ="Select TimeOn from PRODUCTIONS_MONITOR where MachCode='"+MachCode+"'";
        pst = con.prepareStatement(sql);
        rs = pst.executeQuery();

        while(rs.next()){
            arrCount.add(rs.getInt(1));

        }

        for(int i=0;i<arrCount.size();i++){

             Count = Count + arrCount.get(i);

        }

        if(Count % 10 == 0){

            System.out.println("Time = " + Count);

        }

    }catch(SQLException e){

        e.printStackTrace();

    }

}

这是我的数据库连接

  public static Connection ConnecrDb() {
    try {
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 

       Connection con = DriverManager.getConnection("jdbc:sqlserver://10.228.59.2:1433;databaseName=dbNautilus;user=SA;password=KreedaIntimo@2017;");

        System.out.println("Connected to database !");

    } catch (SQLException sqle) {
        System.out.println("Sql Exception :" + sqle.getMessage());
    } catch (ClassNotFoundException e) {
        System.out.println("Class Not Found Exception :" + e.getMessage());
    }

    return null;
}

1 个答案:

答案 0 :(得分:2)

您的ConnecrDb()方法将新的Connection对象分配给名为con局部变量,然后从不使用

该方法然后返回null

您没有显示方法的调用方式,但实际上并不重要,因为con方法使用的notification() 字段是未分配的(并且因此null),或从null分配了ConnecrDb()返回值,所以无论哪种方式都是null

有鉴于此,为什么您会混淆值为null并导致NullPointerException的原因?


关于您的代码的其他一般评论:

  • 如果MachCode是整数,那么为什么要在SQL中引用它,即为什么where MachCode='"+MachCode+"'";而不是where MachCode="+MachCode;

  • 如果您使用的是PreparedStatement,为什么不使用?参数标记,因为它们打算使用?

  • 使用JDBC时,应使用try-with-resources。

  • Java命名约定是变量名以小写字母开头。

您的代码应为:

int machCode = 1721;
String sql = "select TimeOn from PRODUCTIONS_MONITOR where MachCode = ?";
try (PreparedStatement pst = con.prepareStatement(sql)) {
    pst.setInt(1, machCode);
    try (ResultSet rs = pst.executeQuery()) {
        while (rs.next()) {
            arrCount.add(rs.getInt(1));
        }
    }
}
// rest of code here