質問
私の問題は、私はそう私はコンパイルエラーを取得するtry文で変数を設定する必要があるということです。
は、後になって、私はその変数を使用する必要があるが、それはスコープの外に今ある、またはそう私は信じています。私はそれがその後、外にアクセスできるかもしれないと思ったが、私はまだNullPointerException
取得するには、try文の外に変数を初期化し、nullに設定します。
のコードは、簡単に読ん作るために取り出し、それの多くと、以下の通りです - 私はそれが悪いのコードだけど、私はサーブレットに新しいですし、ちょうどそれは彼らがすることになっている何をしてすべての可動部品で実行されている見たいと思いました。
私はcreateDocs(...)を呼び出し、必要なパラメータを渡し、別のクラスを作成し、それが正常に動作しています。だから、私が呼ぶときrs.getString("name")
私はこれは私が他のクラスから行うまさにあるとして、<=>得る理由として、私は好奇心旺盛作っている(便宜上mainメソッドから実行)し、期待どおりに動作します。
問題の変数は、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();
}
}
解決
あなたの問題は、このif文であります
rs = docs.getDocs(con, start, end, zone, locality);
その後、rsの値がまだnull
で例外がスローされます。だから、私は何だろうと、同じtry-catchブロック内でループを移動しています。また、あなたがそれを使用しようとする前に、それはまだヌルだかどうかを確認することができます。
try-catchブロックの外にnullに値を設定するかの悪いコードではありません。それはあなたがtryブロックの外側RS変数をしたい(そしてそれはcatch句の1の内側に含まれる)場合の対処しなければならないものばかりです。あなたのRSループは、おそらく同じtryブロック内でなければならない一方でます。
他のヒント
あなたは変数RSを宣言されている方法と最初のtry / catchブロックはOKです。
そのちょうどそのあなたが最初のtry / catchでエラーが発生した場合、RSは、がまだはnullになりますことを覚えておく必要がある最初のtry / catch後。だから、あなたがそれにアクセスしようとする前に、あなたがnullのためのRSをテストすることを確認します。
なぜあなたは、単に追加しないでください。
if(rs != null)
の前に
while(rs.next())
このは(私の知る限りそれを理解するように)役立つはずです。
あなたの助けをみんなありがとう。まず、あなたは私がスローされた例外のいくつかの種類があるように持っていたことを識別助けました。私はTomcatのコンソールを見たとき、私はそれは、クラスは、MySQLコネクタのエラーに資金を供給しなかった見ることができました。私は私のプロジェクトではなく、プロジェクト自体の中にその含まれていた - 私はちょうどいい加減に私のlibディレクトリに言及するので、最終的には例外が問題の原因となったが、そのような場合は、あなたの提案(!RS = null)を使用して、私が得る助けました根本的な原因に。
当初、私はそれは、変数がスコープ外であることとは何かを持っていたと思いました。明らかにそれはそうではありませんでした。