2017-09-27 7 views
1

(背景:私の新しい上級開発者は、自分の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クラスの両方で値をハードコードしました。

だから私は、ここにお願いしたいと思いますいくつかの質問を持っている

  1. ハードコーディングされた値がnull? (私の知識からは、System.out.printlnを使用して値を出力することができるので、ハードコードされた値はnullとはみなされません。しかし、私の場合、それはまだ異なっているように見えます。 .userMaint.AdminUserMaintAction.save()で例外が発生したことを示すstacktraceに気づきましたので、そのクラスに移動して、値を出力しようとしました。私は値を見ることができます、それはつまり、私はオブジェクトがnullではないことを確認することができますか?

  2. オブジェクトがnullでない場合、nullポインタの例外を解決する方法はありますか?

ありがとうございました。

編集 皆様のコメントと回答に感謝します。私はadminUserMaintServiceがnullであることに気づき、nullにしないようにコードをいくつか入れました。私は、コードを実行すると、それはまだnullポインタ例外を示しているがそう、それは例外がadminUserMaintServiceは、現時点ではnullではないことを意味し

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

であることを示しています。

ここで、ヌルポインタが場所を変更する理由を調べます。

ありがとうございました。

+0

//adminUserMaintService.insert(admFunc); //このコードを試してみて、同じエラーが発生します // this.adminUserMaintService.insert(admFunc); //このコードを試してみても、同じエラーが発生します ...うーん、これらの行は同じです。それはあなたに "théNPE"を与えますか?どの行に正確に?値をチェックするためにデバッグしましたか? – Stultuske

+0

私の最初の仮定は 'adminUserMaintService'自体がnullであることです。 – daniu

+0

' adminUserMaintService'自体がnullであると思います –

答えて

1

あなたはクラスAdminUserMainTActionにライン301を言うように、実際に

adminUserMaintService.insert(admFunc); 

である場合、それはadminUserMaintServicenullであることを意味します。だから、AdminUserMainTServiceにコードを追加することは、「前に」エラーが発生してからあまり役に立ちません。インスタンスメンバーadminUserMaintServiceがどのようにインスタンス化され、どのようにインスタンス化されるかを調べてみてください。インスタンス化されないか、またはインスタンスの代わりにnullを返すファクトリメソッドが使用されます。

+0

あなたはそうです。私は 'adminUserMaintService'がnullであることに気がつき、私はそれに取り組んでいます。ありがとう。 – John

0

あなたの例外スタックトレースフラグメントに見てみましょう:

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

それはことを意味します。例外は例外が第三百一で投げられたaction.userMaint.AdminUserMaintActionの方法save()

  • の内側に発生した

    1. クラス内の線action.userMaint.AdminUserMaintAction

    java.lang.NullPointerExceptionが発生し、ヌルポインタを持つ変数にいくつかのクラスフィールドが呼び出されます。 だから理論的には、クラス番号action.userMaint.AdminUserMaintActionをIDEや他のテキストプロセッサで開くことをお勧めします。正確なコードを見つけるのに役立ちます。 追加情報なしでさらに提案することは難しいです。しかし、私はあなたが間違ったコードをハードコードしたと思います。

  • +0

    あなたはそうです。私はadminUserMaintServiceがnullであることに気付き、私はそれを処理します。ありがとう。 – John

    +0

    ようこそ。 –

    0

    スタックトレースに折り返し例外がラップされている可能性があります。最後に 'によって引き起こされた' stmtを調べて、npeの起源を指摘します。

    +0

    申し訳ありませんが、 'stmt'と' npe'は何ですか?私はスタックトレースを見て、 'service.aidw.AdminUserMaintService.insert'だけ私はソースコードを見つけることができます、残りの私はソースコードを見つけることができません。ありがとう – John

    +0

    これがスタックトレースの唯一の例外かどうかを確認したいと思います。この詳細のみが表示されている場合は、adminUserMaintServiceの値をデバッグ/印刷することができます。 nullを出力すると、このサービスはnullポインタ例外を引き起こしています。 – manoj

    +0

    お返事ありがとうございます。エラーメッセージが 'java.lang.NullPointerException'だけを表示し、他の例外は表示されないので、おそらくスタックトレースの唯一の例外だと思います。 – John

    関連する問題