2017-09-27 1 views
1

(Hintergrund: Mein neuer Senior-Entwickler möchte meine Java-Fähigkeiten kennen, er gibt mir ein Programm, das einen Fehler verursacht. Er möchte, dass ich erkläre, warum der Fehler auftritt und wie um den Fehler zu lösenVerwenden Sie fest codierten Wert und immer noch java.lang.NullPointerException

Ich führe das Programm und ich finde den Fehler ist java.lang.NullPointerException, es zeigt auch den StackTrace.Von meinem Wissen (manbe ich falsch), in der Regel die erste Nachricht zeigt an, dass der Fehler auftritt die Klasse, in meinem Fall, zeigt es

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

ich bitte den neuen Senior-Entwickler für den Quellcode, weil ich den Code in der AdminUserM anzeigen möchte aintAction Klasse

Bevor ich meine Frage posten, ich lese diesen Beitrag What is a NullPointerException, and how do I fix it? über den Fehler

ich es bemerken sind einige andere Beiträge über diesen Fehler, so grob ich die Null-Zeiger Ausnahme wissen, weil das Objekt oder etwas null ist .

aber ich kann immer noch nicht herausfinden, die, wie die Ausnahme zu lösen, so entscheiden, ich meine Frage hier) zu veröffentlichen

Inhalt

In AdminUserMaintAction Klasse finde ich die Methode save(). Hier ist der Code.

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();  
} 

Vom stacktrace, tritt der Fehler in dieser Zeile

adminUserMaintService.insert(admFunc); 

ich dort finden eine Klasse namens AdminUserMaintService Klasse und der Einsatz Methode ist. Hier ist der Code

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(); 
} 

ich den Code gelesen und es scheint in Ordnung, und ich weiß nicht, warum es Fehler tritt auf, weil es keinen Code gibt Nullwert zurück.

Es gibt auch eine Sache, die ich in der AdminUserMaintService-Klasse nicht verstehe, hat die Insert-Methode harten Code-Wert wie "Loginid", 3, "erstellt von" und "geändert von" und immer noch den Nullzeiger Ausnahme?

ich glaube, das Problem in AdminUserMaintAction Klasse ist wie die Stacktrace gibt den Fehler zeigt in

In AdminUserMaintAction Klasse verwende ich System.out.printin Wert im Code zu drucken. Hier ist, was ich in dem Code setzte

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(); 

} 

Auch ich hart Codewert in der insert-Methode in AdminUserMaintService Klasse setzen.

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); 
     } 


} 

Allerdings, wenn ich das Programm ausführen, gibt es immer noch die Nullzeiger Ausnahme.

Ich habe System.out.println verwendet, um etwas zu drucken, ich bemerke, dass der Wert nicht null ist. Ich verstehe nicht, warum ich die Ausnahme bekomme, ich habe den Wert sowohl in der AdminUserMaintAction- als auch in der AdminUserMaintService-Klasse fest codiert.

So habe ich einige Fragen hier stellen mögen,

  1. Fest codierter Wert ist null? (Von meinem Wissen her glaube ich nicht, dass ein hart codierter Wert gleich null ist, weil System.out.println den Wert ausgeben kann. In meinem Fall scheint es jedoch anders zu sein, es zeigt immer noch eine Nullzeiger-Ausnahme an und zeigt den Ort in Aktion an .userMaint.AdminUserMaintAction.save())

  2. Da ich die Stacktrace, die die Ausnahme auftreten in action.userMaint.AdminUserMaintAction.save() bemerken, so gehe ich zu dieser Klasse, diese Methode zu versuchen, Wert zu drucken und Ich kann den Wert sehen, also kann ich bestätigen, dass das Objekt nicht null ist?

  3. Wenn das Objekt nicht null ist, gibt es eine Möglichkeit, die Nullzeigerausnahme zu lösen?

Danke für Ihre Zeit.

Edit Dank alle Kommentare und Antworten, ich bemerke adminUserMaintService ist null und ich habe ein wenig Code, um es nicht null. Also, wenn ich den Code ausführen, obwohl es immer noch die Null-Zeiger Ausnahme zeigt, zeigt es die Ausnahme in ist

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

Das bedeutet adminUserMaintService in diesem Moment nicht null ist.

So jetzt werde ich studieren, warum der Nullzeiger die Position ändert.

Danke.

+0

//adminUserMaintService.insert(admFunc); // Ich versuche diesen Code und es tritt derselbe Fehler auf // this.adminUserMaintService.insert (admFunc); // Ich versuche diesen Code und es tritt der gleiche Fehler zu ... nun, duh, diese Zeilen sind identisch. es gibt dir "die NPE"? Auf welcher Linie genau? hast du es überprüft, um die Werte zu überprüfen? – Stultuske

+0

Meine erste Annahme wäre, dass "adminUserMaintService" selbst null ist. – daniu

+0

Ich würde vermuten, dass "adminUserMaintService" selbst null ist –

Antwort

1

Wenn, wie Sie sagen, Linie 301 in der Klasse AdminUserMainTAction in der Tat ist

adminUserMaintService.insert(admFunc); 

es bedeutet, dass adminUserMaintServicenull ist. Das Hinzufügen von Code in AdminUserMainTService hilft nicht viel, da der Fehler "vor" auftritt. Versuchen Sie herauszufinden, wann das Instanzmitglied adminUserMaintService instanziiert wurde und wie. Es wird nie instanziiert oder es wird eine Factory-Methode verwendet, die statt einer Instanz null zurückgibt.

+0

Sie haben Recht. Ich bemerke, dass "adminUserMaintService" null ist und ich werde daran arbeiten. Vielen Dank. – John

0

Lets in Ihre Ausnahme-Stack-Trace-Fragment aus:

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

Es bedeutet, dass:

  1. Die Ausnahme innerhalb der action.userMaint.AdminUserMaintAction ‚s Methode aufgetreten save()
  2. Die Ausnahme bei der 301. geworfen wurde Linie in der Klasse action.userMaint.AdminUserMaintAction

Die java.lang.NullPointerException tritt auf, dann rufen Sie ein Klassenfeld für eine Variable mit Nullzeiger auf. Also, in der Theorie sollten Sie besser die Klasse action.userMaint.AdminUserMaintAction in einer IDE oder einem anderen Textprozessor öffnen, der Zeilen nummeriert. Es wird Ihnen helfen, den genauen Code zu finden. Es ist schwer, mehr ohne zusätzliche Informationen vorschlagen. Aber ich nehme an, Sie haben den falschen Code fest programmiert.

+0

Sie haben Recht. Ich bemerke adminUserMaintService ist null und ich werde daran arbeiten. Vielen Dank. – John

+0

Gern geschehen. –

0

Es ist möglich, dass in der Stack-Ablaufverfolgung mehrere Ausnahmen enthalten sind. so überprüfen Sie die letzte "verursacht durch" stmt, um den Ursprung von Npe aufzuzeigen.

+0

Es tut mir leid, würdest du mir bitte sagen, was ist 'stmt' und' npe'? Ich schaue auf den Stack-Trace, nur 'service.aidw.AdminUserMaintService.insert' Ich kann im Quellcode finden, den Rest kann ich nicht den Quellcode finden. Danke – John

+0

Ich wollte bestätigen, wenn dies die einzige Ausnahme im Stacktrace ist. Wenn Sie nur dieses Detail sehen, können Sie versuchen, den Wert von adminUserMaintService zu debuggen/drucken. Wenn es null ausgibt, verursacht dieser Dienst die Nullzeigerausnahme. – manoj

+0

Vielen Dank für Ihre Antwort. Ich denke, das ist vielleicht die einzige Ausnahme in Stacktrace, weil die Fehlermeldung nur 'java.lang.NullPointerException' und keine weiteren Ausnahmen anzeigt. – John

Verwandte Themen