2009-05-10 5 views
0

私の問題は、tryステートメントで変数を設定する必要があります。それ以外の場合は、コンパイルエラーが発生します。tryステートメントで変数を設定するのを避ける方法

後でその変数を使用する必要がありますが、現在は範囲外です。私はtry文の外で変数を初期化し、それをヌルに設定しましたが、外部にアクセスできるかもしれないと思っていましたが、まだNullPointerExceptionがあります。

コードは以下のとおりです。読みやすくするためにコードを取り入れています。悪いコードだとわかっていますが、私はサーブレットを初めて使っています。 。

私はcreateDocs(...)を呼び出し、必要なパラメータを渡す別のクラスを作成しました。これは正常に動作します。だから私がrs.getString("name")と呼んだときに私がNullPointerExceptionを得るのは、これがまさに私が他のクラス(便宜上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(); 
    } 
} 
+0

コードには、XSSの脆弱性が存在するように見えますか? –

+0

私は本当の問題は、例外が発生した後も何も起こらないかのように続行することだと思います。例外をスローした場合やエラーを返す場合は、rsを設定する必要はありません。注:スタックトレースはどこに行きますか?ユーザーはスタックトレースを見ません。エラーが発生したことをユーザーに知らせるのがよりフレンドリーかもしれません。 –

答えて

5

あなたの問題は、このif文ということです:

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

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

try-catchブロックの外側で値をnullに設定しても、悪いコードではありません。これは、rs変数をtryブロックの外にしたい場合(そしてcatch節の中にrs変数が含まれている場合)に行う必要があります。あなたのrs whileループはたぶん同じtryブロック内にあるはずです。これは役立つはず

if(rs != null) 

while(rs.next()) 

+0

cletusに感謝しますが、なぜrs.getString( "name")を呼び出すときにNullPointerExceptionが発生するのか知っていますか? – Ankur

+0

私はあなたのポイントのキーポイントを逃した。今更新されました。サーブレットのログをチェックすると、例外がスローされたことになります。 – cletus

2

は、なぜあなたは単に

+0

ありがとう、私はそれをします。しかし、この場合、rsはnullであってはなりません。データが存在し、メソッドが別のクラスから呼び出されたときに正常に動作します。 rs = docs.getDocs(con、start、end、zone、locality)に関連してnullであるという事実です。 tryステートメント内で起こっている? – Ankur

+0

はい、すでに他の人が言っているように、エラーがある可能性があるので、rsがtry-blockの後でnullでないことを確かめることはできません。 –

4

(限り私はそれを理解したように)あなたが変数RSを宣言されている方法を追加しないでください最初のtry/catchブロックはokです。

最初のtry/catchの後には、最初のtry/catchにエラーがあった場合、はまだになることを覚えておく必要があります。だから、アクセスしようとする前にrsがヌルであることを確認してください。

0

ありがとうございました。最初に、何らかの例外がスローされなければならないことを特定するのを手伝ってくれました。私がTomcatコンソールを見ると、それはMySQLコネクタのクラス・ファンド・エラーではないことがわかりました。私はプロジェクトにそれを含めましたが、プロジェクトそのものには含まれませんでした。私はlibディレクトリでそれを怠惰に参照していましたので、最終的には例外が原因でしたが、if(rs!= null)根本的な原因に。

最初は、変数が有効範​​囲外であることと関係があると思いました。明らかにそうではありませんでした。

関連する問題