从SQL数据库使用String时出现NullPointerException

时间:2016-08-20 15:36:18

标签: java sql database string nullpointerexception

我正在尝试从SQL数据库中的一行使用String读取,但是当我这样做时,我得到以下NullPointerException:

Exception in thread "main" java.lang.NullPointerException
    at ReadCol.data(ReadCol.java:37)
    at ReadCol.main(ReadCol.java:50)

我的代码如下所示......

public String[] array;    
ResultSet rs=st.executeQuery("select * from ATTENDANCE");

while(rs.next()){
    File file = new File("E:\\eclipse\\workspace\\AutoAttendanceSystem\\res\\AttendanceData.csv");
    List<String> lines = Files.readAllLines(file.toPath(), StandardCharsets.UTF_8);
    for (String line : lines) {
        array = line.split(",");
        // This is line 37 :
        if(rs.getString(1).equals(array[0]) && rs.getString(7).equals(array[6])){
            JOptionPane.showMessageDialog(null, "Can't Update Because record already exist");
        }
    }

这是SQL表的结构:

CREATE TABLE "ATTENDANCE" ( 
   "ATTENDANT_NAME" VARCHAR2(4000), 
   "ATTENDANT_AGE" NUMBER, 
   "ATTENDANT_CONTACT_NO" NUMBER, 
   "ATTENDANT_DEPARTMENT_NAME" VARCHAR2(4000), 
   "REGISTRATION_NUM" VARCHAR2(50), 
   "ABSENT_PRESENT" VARCHAR2(4000) DEFAULT 'Absent', 
   "ATTENDANCE_TIME_DATE" VARCHAR2(4000) 
)

以下是该表中一行的示例:

Sun 2016.08.14 at 11:21:43 PM PDT, null, null, Thu 2016.08.18 at 01:58:34 AM PDT, null, Thu 2016.08.18 at 02:13:26 AM PDT, null

有什么问题?

1 个答案:

答案 0 :(得分:1)

发生了什么

问题出现在您致电rs.getString(7).equals(...)rs.getString(1).equals时:这意味着getString已退回null

这可能有两个原因:

  1. 您提出的专栏(在第1或第7列中)不存在

    • (鉴于您的SQL表结构,似乎并非如此)
  2. NULL值必须已存储在列中,getString会返回null,这就是为equals调用null会引发异常的原因。< / p>

  3. 关于此的读物:

    如何解决问题

    首先,要知道导致问题的列,请在2行上分隔条件并查看哪一行引发异常:

    if(rs.getString(1).equals(array[0]) && 
       rs.getString(7).equals(array[6])){
    

    如果您的数据库可以保留NULL值,那么您应该做的是在应用equals之前对其进行测试:

    if( ( rs.getString(1) == null && array[0] == null
        || rs.getString(1) != null && rs.getString(1).equals(array[0]) )
        && ... // same for 7th column
    

    旁注

    1. You should refer to columns using their names rather their index.

    2. 为了使代码更容易理解,您可以在变量中存储要比较的字符串,然后才能测试这些变量的条件。

    3. 最终结果

      String databaseResult1, databaseResult2, fileResult1, fileResult2;
      
      
      // Start looping
      // ...
      
         databaseResult1 = rs.getString("ATTENDANT_NAME");
         fileResult1 = array[0];
         databaseResult2 = rs.getString("ATTENDANCE_TIME_DATE");
         fileResult2 = array[6];
      
         if(
             ( databaseResult1 == null && fileResult1 == null 
               || databaseResult1 != null && databaseResult1.equals(fileResult1) )
             &&
             ( databaseResult2 == null && fileResult2 == null 
               || databaseResult2 != null && databaseResult2.equals(fileResult2) )
            ...