AbstractServerに次のメソッドがあります。
synchronized protected void clientException(
ConnectionToClient client, Throwable exception) {
try
{
client.close();
}
catch (Exception e) {}
}
目的は、クライアントからのキャッチされていないすべての例外をキャッチし、サーバーへの接続を終了することです。これがcloseメソッドです:
final public void close() throws IOException
{
readyToStop = true; // Set the flag that tells the thread to stop
try
{
closeAll();
}
finally
{
server.clientDisconnected(this);
}
}
私のサーバーには次の方法があります。
public ArrayList<String> getMemberdetails (ArrayList<String> string)
{
ArrayList<String> ref = new ArrayList<String>();
try
{
stmt = conn.createStatement();
String s = new String ("SELECT * FROM readercard mc, sysuser s WHERE s.userID=mc.userID AND mc.userID='"+ string.get(1) +"'");
System.out.println(s);
ResultSet rs = stmt.executeQuery("SELECT * FROM readercard mc, sysuser s WHERE s.userID=mc.userID AND mc.userID='"+ string.get(1) +"'");
if(rs.next())
{
ref.add(rs.getString("userFirstName"));
ref.add(rs.getString("userLastName"));
ref.add(rs.getString("email"));
ref.add(rs.getString("status"));
ref.add(rs.getString("userPhone"));
}
if (!rs.first())
ref.add(null);
rs.close();
} catch (SQLException e) {e.printStackTrace(); }
catch (Exception e) {e.printStackTrace();}
return ref;
}
このメソッドは、クライアントが接続を開始するたびに昼食をとり、最初に呼び出されたときに機能します。
サーバー上の別のメソッドからこのメソッドを呼び出すと、問題が発生します。行で:stmt = conn.createStatement();
それは機能していません。クライアントアプリケーションがスタックし、サーバーログに、サーバーがクライアントのcloseメソッドを呼び出したことがわかります(これは、例外が発生したことを意味します)。
そのラインサーバーでデバッグを続けると、すぐに次のページが表示されます。
getMemberdetails
最初に、メソッドが最初の呼び出し(クライアントがアプリケーションにサインインするたび)で問題なく機能すると言ったように、どのような例外が発生する可能性があるのかわかりません。次に、例外stmt = conn.createStatement();
をスローした場合、SQLException
なぜそれがcatchステートメントに捕らえられないのですか?