2017-09-27 45 views
1

(背景:我的新高级开发人员想知道我的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类中的值。

所以我有一些问题想问一下这里,

  1. 硬编码值为null? (据我所知,我不认为硬编码的值等于null,因为使用System.out.println可以打印该值。但在我看来,它看起来不同,它仍然显示空指针异常,指示实际位置.userMaint.AdminUserMaintAction.save())

  2. 因为我注意到,指示action.userMaint.AdminUserMaintAction.save()出现异常的堆栈跟踪,所以我去的那类,该方法尝试打印值和我可以看到价值,那么这是否意味着我可以确认该对象不是null?

  3. 如果对象不为空,有什么办法可以找到解决空指针异常的方法吗?

谢谢你的时间。

编辑 感谢大家的意见和答案,我注意到adminUserMaintService是空的,我把一些代码,它使它不为空。所以,当我运行的代码,但它仍然显示空指针异常,它显示的例外是

Connection conn = jdbcTemplate.getDataSource().getConnection(); 

这意味着adminUserMaintService不为空,在这一刻。

所以现在我将研究为什么空指针改变位置。

谢谢。

+0

//adminUserMaintService.insert(admFunc); //我尝试这段代码,它发生同样的错误 // this.adminUserMaintService.insert(admFunc); //我试试这个代码,它也发生了相同的错误 ......好吧,这些行是相同的。它给你“这个NPE”?在哪条线上?你有调试它来检查值吗? – Stultuske

+0

我的第一个假设是'adminUserMaintService'本身是空的.. – daniu

+0

我想'adminUserMaintService'本身是空的 –

回答

1

如果像你说的类AdminUserMainTAction线301实际上是在

adminUserMaintService.insert(admFunc); 

这意味着adminUserMaintServicenull。因此,将代码添加到AdminUserMainTService中并没有多大帮助,因为错误发生在“之前”。尝试找出实例成员adminUserMaintService何时实例化以及如何实现。它永远不会被实例化,或者使用一些工厂方法,它本身会返回null而不是实例。

+0

你说得对。我注意到'adminUserMaintService'为空,我会对它进行处理。谢谢。 – John

0

让我们看看你的异常堆栈跟踪片段:

java.lang.NullPointerException at action.userMaint.AdminUserMaintAction.save(AdminUserMaintAction.java:301) 

这意味着:

  1. 异常的action.userMaint.AdminUserMaintAction的方法save()
  2. 唯一的例外是在第301位抛出内部发生线上课action.userMaint.AdminUserMaintAction

java.lang.NullPointerException发生,然后你调用一个变量与空指针的一些类字段。 因此,理论上,您最好在IDE或其他文字处理器中打开类action.userMaint.AdminUserMaintAction。它将帮助您找到确切的代码。 如果没有附加信息,很难提出更多建议。但是我想你会硬编码错误的代码。

+0

你说得对。我注意到adminUserMaintService是空的,我会努力。谢谢。 – John

+0

不客气。 –

0

堆栈跟踪中可能包含多重异常。所以你检查最后由'stmt'引起的,指出npe的起源。

+0

对不起,你能告诉我什么是'stmt'和'npe'吗?我查看堆栈跟踪,只有'service.aidw.AdminUserMaintService.insert'我可以在源代码中找到,其余的我找不到源代码。谢谢 – John

+0

我想确认这是否是堆栈跟踪中唯一的异常。如果你只看到这个细节,你可以尝试调试/打印adminUserMaintService的值。如果它打印出null,那么这个服务导致空指针异常。 – manoj

+0

谢谢你的回复。我想这可能是堆栈跟踪中唯一的异常,因为错误消息只显示'java.lang.NullPointerException'而没有其他异常。 – John