(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,
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())
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?
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.
//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
Meine erste Annahme wäre, dass "adminUserMaintService" selbst null ist. – daniu
Ich würde vermuten, dass "adminUserMaintService" selbst null ist –