0

このメソッドを作成しましたが、メソッドを呼び出そうとすると、null ポインター例外が返されます。誰が何が悪いのか教えてもらえますか? お願い助けて

public Talent SearchTalentQuery(int talentID){
    String SearchTalentString = "SELECT * FROM TALENT WHERE TALENTID = "+talentID+";";
    Talent talent=null;
    try{
        //error in select query
        if(getOracleXEConnection()!=null){

            Statement statement = conn.createStatement();
            ResultSet rs = statement.executeQuery(SearchTalentString);                       
                   while( rs.next()){
                   talent.setTalentName(rs.getString("talentname"));
                   talent.setTalentFocus(rs.getString("maintalentfocus"));
                   talent.setTalentNationality((rs.getString("nationality")));
                   talent.setTalentGroup(rs.getString("talentgroup"));
                   talent.setTalentHiredate(rs.getString("hiredate"));
                   talent.setTalentAge(Integer.parseInt(rs.getString("age")));
                   talent.setTalentID(Integer.parseInt(rs.getString("talentid")));
                   }

            rs.close();
            statement.close();
            conn.close();


            return talent;
        }
        else{
            return null;
        }
    }
    catch(SQLException | NumberFormatException e){
        e.printStackTrace();
    }
    return null;
4

6 に答える 6

5

割り当てるオブジェクトをインスタンス化していません。Talent

Talent talent=null;
...
talent.setTalentName(...

あなたのコメントに対処するには、null ポインターへの参照を初期化しています。メソッドを呼び出すには、オブジェクトをインスタンス化し、それを指すtalent必要があります。

制約などに応じて、メソッドはこのTalentオブジェクトを返すか、反復ごとに新しいオブジェクトを作成してこれらのコレクションを返します。

于 2012-10-03T12:41:03.047 に答える
3

while ブロックの先頭でタレントオブジェクトをインスタンス化するだけです

...

while( rs.next()){ 
 talent = new Talent(); //or whatever
 talent.setTalentName(rs.getString("talentname"));

...

于 2012-10-03T12:44:24.513 に答える
2

コード全体がタレント オブジェクトのメモリを初期化しないためです。タレント オブジェクトのメモリを初期化する必要があります。

使用: 才能の才能 = 新しい才能 (); Talent 才能 = null の場所で。

それはあなたの問題を解決するかもしれません。

于 2012-10-03T12:46:06.643 に答える
1

タレントをインスタンス化する必要がありますが、このコードは SQL インジェクションに対して非常にオープンであるため、PreparedStatement を実際に使用する必要があります...

http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html

最後に、慣例として、searchTalentString は小文字で開始する必要があります (最終的にすることもできます)...

String searchTalentString = "SELECT * FROM TALENT WHERE TALENTID = "+talentID+";";
于 2012-10-03T12:52:32.093 に答える
0

への変更

String SearchTalentString = "SELECT * FROM TALENT WHERE TALENTID = "+talentID+";";
Talent talent=new Talent();

または、このようなもの。

于 2012-10-03T12:44:33.150 に答える