【问题标题】:NullPointerException when using String from SQL database使用 SQL 数据库中的字符串时出现 NullPointerException
【发布时间】:2016-12-27 14:36:26
【问题描述】:

我正在尝试使用从 SQL 数据库中的一行读取的字符串,但是当我这样做时,我得到以下 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

有什么问题?

【问题讨论】:

  • 字符串何时等于数组?!什么数组?
  • rs 是什么,array 是什么,你能告诉我们所有的代码吗?
  • 请发布你最好的minimal reproducible example尝试。
  • 对不起...我已经更新了代码...
  • @Mee 请提供minimal reproducible example,并特别注意“complete”和“verifiable”。

标签: java sql database string nullpointerexception


【解决方案1】:

发生了什么

问题似乎出在您调用 rs.getString(7).equals(...)rs.getString(1).equals 时:这意味着 getString 已返回 null

这可能有两个原因:

  1. 您询问的列(在这种情况下是第 1 列或第 7 列)不存在

    • (鉴于您的 SQL 表结构,这里似乎不是这种情况)
  2. 必须在列中存储一个 NULL 值,并且 getString 返回 null,这就是为什么在 null 上调用 equals 会引发异常。

相关阅读:

如何解决问题

首先,要知道是哪一列导致了问题,将条件分成两行,看看哪一列引发了异常:

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. 为了使代码更易于理解,您可以将要比较的字符串存储在变量中,然后再测试这些变量的条件。

最终结果

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) )
      ...

【讨论】:

  • 在数组[6] 中的数据是这样的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 ......是否因为这个null 而发生异常?
  • 不客气。我添加了一些关于如何使代码更容易理解的细节
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多