我正在尝试从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
有什么问题?
答案 0 :(得分:1)
问题出现在您致电rs.getString(7).equals(...)
或rs.getString(1).equals
时:这意味着getString
已退回null
。
这可能有两个原因:
您提出的专栏(在第1或第7列中)不存在
NULL值必须已存储在列中,getString
会返回null
,这就是为equals
调用null
会引发异常的原因。< / p>
关于此的读物:
有关ResultSet.getString
返回值的信息:ResultSet's documentation。
Why calling a method on a reference that points to null
throws a NullPointerException
首先,要知道导致问题的列,请在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
You should refer to columns using their names rather their index.
为了使代码更容易理解,您可以在变量中存储要比较的字符串,然后才能测试这些变量的条件。
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) )
...