7

私はJavaを初めて使用しますが、すぐに習得しています。私がよく遭遇することの 1 つは、クエリでいっぱいの 1 つの関数と一般的なコードだけを使用することになり、それを個別の関数に分割したいということです。たとえば、次のようにします。

public ResultSet getApples (){
    ResultSet rs;
    try{
        PreparedStatement stmt = con.prepareStatement("SELECT * FROM fruit WHERE type='apples'");
        rs = stmt.executeQuery();
    } catch (SQLException e){
        e.printStackTrace();
    }
    return rs;  
}

理想的には、これは私がやりたいことであり、1 つの関数内にすべての try と catch を含めることですが、これによりエラーが発生します。Local variable may not have been initilized

私はこれを行うことができることを認識しています:


public function start(){
    try{
        ResultSet apples = getApples();
    catch (SQLException e){
        e.printStackTrace();
    }
}

public ResultSet getApples () throws SQLException { 
    PreparedStatement stmt = con.prepareStatement("SELECT * FROM fruit WHERE type='apples'");
    return stmt.executeQuery();
}

しかし、結果を返すだけでなく、関数内で例外を処理したいのです。

編集 さて、提供されているものに対する修正された回答です。この質問に対する私の全体的な目標は、スクリプトの主な機能をできるだけきれいにすることでした。余分なif ( _resultSet != null )ものでさえ、私はあまり好きではありませんでした。そうは言っても、私はこの結果にかなり満足しています:

public ResultSet getApples (){
    try{
        PreparedStatement stmt = con.prepareStatement("SELECT * FROM fruit WHERE type='apples'");
        return stmt.executeQuery();
    } catch (SQLException e){
        System.out.println("************************");
        System.out.println("Class.getApples null");
        System.out.println(e.getMessage());
        return null;
    }   
}

すべてがgetApples関数内で処理され、 が呼び出されたときに getApples 例外_resultSet.next()を取得して出力するため、エラーを見つけてすばやくデバッグできます。NullPointerException

4

5 に答える 5

3

最初にrsをnullに初期化します。

public ResultSet getApples (){
    ResultSet rs = null;
    try{
        PreparedStatement stmt = con.prepareStatement("SELECT * FROM fruit WHERE type='apples'");
        rs = stmt.executeQuery();
    } catch (SQLException e){
        e.printStackTrace();
    }
    return rs;  
}
于 2012-08-10T12:51:53.207 に答える
3

このようにRSを宣言できます

ResultSet rs = null;

ただし、関数を呼び出す場所:

ResultSet apples = getApples ()

チェックする必要があります:

if(apples == null)
{
    //do something, because your query did not work.
}
于 2012-08-10T12:52:43.237 に答える
2

ResultSet rs を初期値に設定していないためです。そして最後にあなたはそれを返しています。例外が発生し、rs 値に値が設定されていない場合はどうなりますか。解決するには、宣言時に rs に null 値を割り当てる必要があります。

于 2012-08-10T12:54:08.190 に答える
1

最初の例で私が目にする最大の問題 (初期化していないこと以外rs) は、クリーンアップを適切に処理していないことです。finally閉じるブロックが必要stmtです。

これらすべてが確実に行われるようにするための非常に良い方法の 1 つは、Spring のJDBCTemplateを使用することです(詳細なドキュメントはこちら)。これにより、接続管理の詳細がすべて処理されます。を処理する SQL とコードを記述するだけですResultSet。さらに良いことに、Spring の宣言型トランザクション管理を使用できます。

于 2012-08-10T13:40:53.617 に答える