異なるスレッドで実行されている 2 つの Java クラスがあります。1 つのクラスがインターネットに接続し、もう 1 つのクラスが接続ステータスを監視します。サーバーの応答の読み取り中に接続を作成するクラスが遅延する場合にIOExceptionをスローしたいと同時に、サーバーから応答が読み取られている場合に例外をスローしたくありません。
私はこのコードを思いつきました。
私の問題は、メインクラスである NetworkConnector クラスによってキャッチされるクラス NetworkMonitor で IOException をスローしたいことです。ただし、コンパイラはキャッチされていない例外について不平を言います。
public class NetworkConnector{
//method that connects to the server to send or read data.
public String sendData(String url ,String data){
try{
//start the monitor before we read the serverResponse
new NetworkMonitor().startMonitor();
int read ;
while ((read = inputStream.read()) != -1) {
//read data.
sb.append((char) read);
//monitor if we are reading from Server if not reading count 10 to 0 and throw IoException.
new NetworkMonitor().resetCounter();
}
} catch(IOException ex){
//all IOException should be caught here.
}
}
}
// ネットワーク アクティビティが発生しているかどうかを監視するクラス。
public class NetworkMonitor implements Runnable {
private final int WAITTIME =10;
private int counter = WAITTIME;
public void run(){
try{
while(counter > 0){
//waiting here
counter--; //decrement counter.
Thread.sleep(1000);
}
//when counter is at zero throw iOexception
throw new IOException("Failed to get server Response");
} catch(InterruptedException e){
System.out.println(e.getMessage());
} catch(IOException e){
//i want to throw the IOEception here since the exception should
//be caught by the networkConnector class not the monitor class but the compiler complains.
// unreported exception java.io.IOException; must be caught or declared to be thrown
throw new IOException(e.getMessage());
//throwing another exception type is okay ===>why cant we throw the same type of exception we caught.
throw new IllegalArgumentException(e.getMessage());
}
}
//reset the counter if called.
public void resetCounter(){
counter = WAITTIME;
}
public void startMonitor(){
Thread t = new Thread(this);
t.start();
}
}