これは、プログラミング中に私に起こった最も奇妙なことです。はい、私はプログラミングのプロではありませんが、学習しながら学んでいます。サーバーと通信するアプリ、メインスレッドのソケット、読み取りは別のクラスとスレッドで行われ、asynctask を使用して別のクラスで書き込みが行われます。
問題は LocationManager です。サーバーと通信し、コマンドの書き込み/読み取りを問題なく行うことができました。LocationManager とそのリスナーを実装しました。
次に、テキストビューを locatinChanged の新しい座標で更新するメソッドの実装に進みました。ここまでは順調ですね。問題は、Eclipse でエミュレーター コントロールを使用して座標を送信すると、アプリが stringOutOfBoundsException でクラッシュしたことです (私は 3 年間プログラムしてきましたが、これを見たことがありません)。私はそれをステップスルーしたコードなどを見ました。スタックトレース、logcat、コンソールなど、考えられるあらゆる場所を読みましたが、どこにも行きませんでした。最終的に次のようなリーダースレッドに移動するまで:
public class ReaderThread extends Thread {
public void run() {
new Thread(new Runnable(){
public void run(){
try {
//Establish a bufferedreader to read from the socket/server.
in = new BufferedReader(new InputStreamReader(socket.getInputStream()), 8 * 1024);
}
catch(Exception e) { e.printStackTrace(); }
//As long as connect is true.
while (connected) {
String line;
try {
//Try to read a line from the reader.
line = in.readLine();
System.out.println(in.readLine());
if (in == null) {
//No one has sent a message yet.
System.out.println("No data recieved");
}
else {
int i = 0;
//As long as someone is sending messages.
while((line = in.readLine()) != null ){
//Make a new Message.
Message msg;
msg = new Message();
//Set the object to the input line.
msg.obj = line;
//Set an id so it can be identified in the main class and used in a switch.
msg.what = i;
System.out.println("i is: "+i);
//Send the message to the handler.
Main.this.h.sendMessage(msg);
}
}
}
catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
}).start();
}
変数 i は、サーバーが送信したものに応じて if ステートメントに含まれていますが、この問題とは関係がないため、それを切り取りました。
問題は、おかしなキャッチです。catch が IOException の場合、アプリはクラッシュします。運が悪かったので、これを Exception に変更し、 e.message を出力してエラーをキャッチし、その原因を確認しました。問題は、この変更で修正されたことです。IOException を単純な Exception に切り替えると、このような問題をどのように修正できますか?
IOException の場合と同様に、プログラムは「エラーをキャッチするつもりはありませんが、エラーはありません」と言いますが、例外を使用すると、「まあ、キャッチできるので続行します」と表示されます。
私のアプリは動作していますが、これを理解できません。なぜ、どのようにこれが起こるのですか?