(背景:私の新しい上級開発者は、自分のJavaスキルを知りたいと思っているので、エラーの原因となるプログラムを私に与えます。エラーを解決するにはハードコーディングされた値を使用しても、java.lang.NullPointerExceptionが発生する
プログラムを実行すると、エラーがjava.lang.NullPointerExceptionであることがわかります。スタックトレースも表示されます。私の知る限りでは、通常、最初のメッセージはエラーが発生したことを示します。どのクラス、私の場合には、それは私がAdminUserMでコードを表示したいので、私は、ソースコードのための新しい上級開発者に尋ねる
java.lang.NullPointerException at action.userMaint.AdminUserMaintAction.save(AdminUserMaintAction.java:301)
を示しaintActionクラス
私は私の質問を投稿する前に、私はエラー
については、この記事What is a NullPointerException, and how do I fix it?を読んで、私は、オブジェクトまたは何かがnullであるのでので大体、私はnullポインタ例外を知っている、このエラーについてのいくつかの他の記事がある気づきます。
しかし、私はまだ私はここに私の質問)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メソッドはそこにあるそこに見つけるこのライン
adminUserMaintService.insert(admFunc);
で発生します。ここにコードがあります
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();
}
私はコードを読んで、それは問題ないと思われます。コードがないので、null値を返すことを示しています。
また、AdminUserMaintServiceクラスでわからないことが1つあります。挿入メソッドには、 "loginid"、3、 "created by"、 "modified by"などのハードコード値があり、例外?
私はこの問題は、スタックトレースが
AdminUserMaintActionクラスでのエラーを示して、私はコード内の値を印刷するのSystem.out.printlnを使用しAdminUserMaintActionクラスであると思います。ここに私がコードに入れたものがあります
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? (私の知識からは、System.out.printlnを使用して値を出力することができるので、ハードコードされた値はnullとはみなされません。しかし、私の場合、それはまだ異なっているように見えます。 .userMaint.AdminUserMaintAction.save()で例外が発生したことを示すstacktraceに気づきましたので、そのクラスに移動して、値を出力しようとしました。私は値を見ることができます、それはつまり、私はオブジェクトがnullではないことを確認することができますか?
オブジェクトがnullでない場合、nullポインタの例外を解決する方法はありますか?
ありがとうございました。
編集 皆様のコメントと回答に感謝します。私はadminUserMaintServiceがnullであることに気づき、nullにしないようにコードをいくつか入れました。私は、コードを実行すると、それはまだnullポインタ例外を示しているがそう、それは例外がadminUserMaintServiceは、現時点ではnullではないことを意味し
Connection conn = jdbcTemplate.getDataSource().getConnection();
であることを示しています。
ここで、ヌルポインタが場所を変更する理由を調べます。
ありがとうございました。
//adminUserMaintService.insert(admFunc); //このコードを試してみて、同じエラーが発生します // this.adminUserMaintService.insert(admFunc); //このコードを試してみても、同じエラーが発生します ...うーん、これらの行は同じです。それはあなたに "théNPE"を与えますか?どの行に正確に?値をチェックするためにデバッグしましたか? – Stultuske
私の最初の仮定は 'adminUserMaintService'自体がnullであることです。 – daniu
' adminUserMaintService'自体がnullであると思います –