使用硬编码的值,仍然得到java.lang.NullPointerException
(背景:我的新高级开发人员想知道我的Java技能,他给了我一个导致错误的程序,他想让我解释为什么会发生错误,以及解决错误使用硬编码的值,仍然得到java.lang.NullPointerException
我运行程序,我发现错误是java.lang.NullPointerException,它也显示了stacktrace。从我的知识(manbe我错了),通常第一条消息指示错误发生在哪个班,在我的情况,这表明
java.lang.NullPointerException at action.userMaint.AdminUserMaintAction.save(AdminUserMaintAction.java:301)
我索要源代码的新的高级开发人员,因为我想在AdminUserM查看代码aintAction类
之前,我张贴我的问题,我看到这篇文章What is a NullPointerException, and how do I fix it?有关错误
我注意到有关于这个错误的一些其他职位,所以大概我知道空指针异常,因为对象或东西是空。
但是,我仍然无法弄清楚如何解决异常,所以我决定张贴在这里我的问题)
内容
在AdminUserMaintAction类,我觉得save()方法。这是代码。
public String save(){
String curloginId = (String) session.get("_loginid");
funcid =1;
AdmFunc admFunc = new AdmFunc();
admFunc.setCreatedBy(curloginId);
admFunc.setCreatedDate(createdDate);
admFunc.setFuncid(funcid);
admFunc.setLoginid(curloginId);
admFunc.setModifiedBy(curloginId);
admFunc.setModifiedDate(modifiedDate);
try {
adminUserMaintService.insert(admFunc);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return view2();
}
从堆栈跟踪,在此行
adminUserMaintService.insert(admFunc);
我发现有一类叫做AdminUserMaintService类和插入的方法是在那里发生的错误。下面是代码
public void insert(AdmFunc admFunc) throws SQLException{
Connection conn = jdbcTemplate.getDataSource().getConnection();
String sql = "INSERT INTO ADM_FUNC (LOGINID, FUNC_ID, CREATED_DATE, CREATED_BY, MODIFIED_DATE, MODIFIED_BY) VALUES (NULL,NULL,NULL,NULL,NULL,NULL)";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, admFunc.getLoginid());
pstmt.setInt(2, admFunc.getFuncid());
pstmt.setTimestamp(3, admFunc.getCreatedDate());
pstmt.setString(4, admFunc.getCreatedBy());
pstmt.setTimestamp(5, admFunc.getModifiedDate());
pstmt.setString(6, admFunc.getModifiedBy());
pstmt.execute();
}
我读的代码,它似乎很好,我不知道为什么,因为没有代码指示返回空值,它会出现误差。
此外,有一件事我不明白在AdminUserMaintService类中,插入方法有硬编码值,如“loginid”,3,“创建者”和“修改者”,仍然获得空指针例外?
我认为这个问题是在AdminUserMaintAction类的堆栈跟踪表明有
错误在AdminUserMaintAction类,我用的System.out.println代码打印值。这里是我的代码
public String save(){
String curloginId = (String) session.get("_loginid");
funcid =1;
AdmFunc admFunc = new AdmFunc();
admFunc.setCreatedBy(curloginId);
admFunc.setCreatedDate(createdDate);
admFunc.setFuncid(funcid);
admFunc.setLoginid(curloginId);
admFunc.setModifiedBy(curloginId);
admFunc.setModifiedDate(modifiedDate);
//I try to print values to see what values inside the code
System.out.println("admfunc.setFuncid is " + admFunc.getFuncid()); //it shows 1
System.out.println("admfunc.setCreatedBy is " + admFunc.getCreatedBy()); //it shows tester
System.out.println("admfunc.setCreatedDate is " + new Timestamp(new Date().getTime())); //it shows today's date and time
System.out.println("admfunc.setMofifiedBy is " + admFunc.getModifiedBy()); //it shows tester
System.out.println("admfunc.setModifiedDate is " +new Timestamp(new Date().getTime())); //it shows today's date and time
System.out.println("admFunc value is" + admFunc); //it shows [email protected]
System.out.println("start save ...");
System.out.println("");
//adminUserMaintService.insert(admFunc); // I try this code and it occurs the same error
// this.adminUserMaintService.insert(admFunc); // I try this code and it occurs the same error too
try {
adminUserMaintService.insert(admFunc);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("end save ...");
return view2();
}
此外,我把硬代码值在AdminUserMaintService类的插入方法。
public void insert(AdmFunc admFunc) throws SQLException{
Connection conn = jdbcTemplate.getDataSource().getConnection();
String sql = "INSERT INTO ADM_FUNC (LOGINID, FUNC_ID, CREATED_DATE, CREATED_BY, MODIFIED_DATE, MODIFIED_BY) VALUES (NULL,NULL,NULL,NULL,NULL,NULL)";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1,"loginid");
pstmt.setInt(2, 3);
pstmt.setTimestamp(3,new Timestamp(new Date().getTime()));
pstmt.setString(4, "created by");
pstmt.setTimestamp(5,new Timestamp(new Date().getTime()));
pstmt.setString(6, "modified by");
pstmt.execute();
try {
conn.setAutoCommit(false);
pstmt.setString(1,"loginid");
pstmt.setInt(2, 3);
pstmt.setTimestamp(3,new Timestamp(new Date().getTime()));
pstmt.setString(4, "created by");
pstmt.setTimestamp(5,new Timestamp(new Date().getTime()));
pstmt.setString(6, "modified by");
pstmt.execute();
conn.commit();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
conn.rollback();
} finally {
pstmt.close();
conn.setAutoCommit(true);
}
}
但是,当我运行该程序,它仍然给我空指针异常。
我用System.out.println来打印一些东西,我注意到这个值不是null。我不明白为什么我得到这个异常,我硬编码了AdminUserMaintAction和AdminUserMaintService类中的值。
所以我有一些问题想问一下这里,
硬编码值为null? (据我所知,我不认为硬编码的值等于null,因为使用System.out.println可以打印该值。但在我看来,它看起来不同,它仍然显示空指针异常,指示实际位置.userMaint.AdminUserMaintAction.save())
因为我注意到,指示action.userMaint.AdminUserMaintAction.save()出现异常的堆栈跟踪,所以我去的那类,该方法尝试打印值和我可以看到价值,那么这是否意味着我可以确认该对象不是null?
如果对象不为空,有什么办法可以找到解决空指针异常的方法吗?
谢谢你的时间。
编辑 感谢大家的意见和答案,我注意到adminUserMaintService是空的,我把一些代码,它使它不为空。所以,当我运行的代码,但它仍然显示空指针异常,它显示的例外是
Connection conn = jdbcTemplate.getDataSource().getConnection();
这意味着adminUserMaintService不为空,在这一刻。
所以现在我将研究为什么空指针改变位置。
谢谢。
如果像你说的类AdminUserMainTAction线301实际上是在
adminUserMaintService.insert(admFunc);
这意味着adminUserMaintService
是null
。因此,将代码添加到AdminUserMainTService
中并没有多大帮助,因为错误发生在“之前”。尝试找出实例成员adminUserMaintService何时实例化以及如何实现。它永远不会被实例化,或者使用一些工厂方法,它本身会返回null
而不是实例。
你说得对。我注意到'adminUserMaintService'为空,我会对它进行处理。谢谢。 – John
让我们看看你的异常堆栈跟踪片段:
java.lang.NullPointerException at action.userMaint.AdminUserMaintAction.save(AdminUserMaintAction.java:301)
这意味着:
- 异常的
action.userMaint.AdminUserMaintAction
的方法save()
- 唯一的例外是在第301位抛出内部发生线上课
action.userMaint.AdminUserMaintAction
java.lang.NullPointerException
发生,然后你调用一个变量与空指针的一些类字段。 因此,理论上,您最好在IDE或其他文字处理器中打开类action.userMaint.AdminUserMaintAction
。它将帮助您找到确切的代码。 如果没有附加信息,很难提出更多建议。但是我想你会硬编码错误的代码。
你说得对。我注意到adminUserMaintService是空的,我会努力。谢谢。 – John
不客气。 –
堆栈跟踪中可能包含多重异常。所以你检查最后由'stmt'引起的,指出npe的起源。
//adminUserMaintService.insert(admFunc); //我尝试这段代码,它发生同样的错误 // this.adminUserMaintService.insert(admFunc); //我试试这个代码,它也发生了相同的错误 ......好吧,这些行是相同的。它给你“这个NPE”?在哪条线上?你有调试它来检查值吗? – Stultuske
我的第一个假设是'adminUserMaintService'本身是空的.. – daniu
我想'adminUserMaintService'本身是空的 –