0

私の問題は、tryステートメントで変数を設定する必要があることです。そうしないと、コンパイルエラーが発生します。

後でその変数を使用する必要がありますが、現在は範囲外であるか、そう信じています。tryステートメントの外部で変数を初期化し、それをnullに設定します。その後、外部からアクセスできる可能性があると思いましたが、それでも。を取得しNullPointerExceptionます。

以下のコードは、読みやすくするために多くのコードが削除されています。これは悪いコードですが、サーブレットは初めてであり、すべての可動部分が想定どおりに動作することを確認したかっただけです。

createDocs(...)を呼び出し、必要なパラメーターを渡す別のクラスを作成しましたが、正常に機能します。これは、他のクラス(便宜上mainメソッドから実行)から実行するものであり、期待どおりに機能するため、呼び出したときになぜrs.getString("name")取得するのか不思議に思っています。NullPointerException

問題の変数はResultSet変数"rs"です-

public class AgReportServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    public AgReportServlet() {
        super();
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ResultSet rs = null;
        try {
            rs = docs.getDocs(con, start, end, zone, locality);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        response.setContentType("text/xml");
        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n" +
                out.println(
                        "<table border=\"0\" cellspacing=\"0\" cellpadding=\"6\">\n");

        // I have a resultset object need to iterate through it to display the file names

        try {
            while (rs.next()) { // page through the result set

                out.println(
                        "  <tr>\n" +
                                "    <td>: " + rs.getString("name") + "</td>\n" +
                                "  </tr>\n"
                );
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        out.println(
                "</table></body>\n" +
                        "</html>"
        );

        out.flush();
        out.close();
    }
}
4

4 に答える 4

5

あなたの問題は、このステートメントが次の場合です。

rs = docs.getDocs(con, start, end, zone, locality);

例外をスローしても、rsの値はまだnullです。したがって、私が行うことは、同じtry-catchブロック内でループを移動することです。または、使用する前に、それがまだnullであるかどうかを確認できます。

ただし、try-catchブロックの外側で値をnullに設定することは、悪いコードではありません。これは、tryブロックの外側にrs変数が必要な場合(およびcatch句の1つの内側に含まれる場合)に実行する必要があることです。rs whileループは、おそらく同じtryブロック内にあるはずです。

于 2009-05-10T11:39:18.580 に答える
4

rs変数と最初のtry/catchブロックを宣言する方法は問題ありません。

最初のtry/catchの後で、最初のtry / catchでエラーが発生した場合でも、rsはnullのままであることを覚えておく必要があります。したがって、アクセスする前に、rsのnullをテストしてください。

于 2009-05-10T11:44:26.680 に答える
2

単純に追加してみませんか

if(rs != null)

while(rs.next())

これは役立つはずです(私が理解している限り)

于 2009-05-10T11:43:42.447 に答える
0

皆さんの助けに感謝します。最初に、ある種の例外がスローされる必要があることを特定するのを手伝ってくれました。Tomcatコンソールを見ると、MySQLコネクタのクラス資金エラーではないことがわかりました。私はそれをプロジェクトに含めましたが、プロジェクト自体には含めませんでした-libディレクトリで怠惰に参照したため、最終的に例外が問題を引き起こしましたが、if(rs!= null)などの提案を使用すると根本的な原因に。

最初は、変数がスコープ外にあることと関係があると思いました。明らかにそうではありませんでした。

于 2009-05-10T12:01:48.487 に答える