【发布时间】:2012-03-09 23:26:42
【问题描述】:
所以这是我在编程过程中遇到的最奇怪的事情。是的,我不是编程专家,但我边走边学。我有一个应用程序与服务器通信,主线程中有一个套接字,读取是在一个单独的类和线程中完成的,并使用 asynctask 在一个单独的类中写入。
问题是位置管理器。我可以很好地与服务器通信并写入/读取命令,我实现了 LocationManager 及其监听器。
然后我开始实施一种方法,用 locatinChanged 上的新坐标更新我的 textview。到现在为止还挺好。事情是当我在 eclipse 中使用 Emulator 控件并发送坐标时,应用程序因 stringOutOfBoundsException 而崩溃(我已经编程了 3 年,现在从未见过这种情况)。我查看了通过它的代码等等。阅读stacktrace、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 语句中,具体取决于服务器发送的内容,但我将其删除,因为它与此问题无关。
问题在于该死的捕获。当捕获为 IOException 时,应用程序崩溃。出于愚蠢的运气,我将其更改为 Exception 并打印 e.message 以捕获错误并查看导致错误的原因。事情是这个变化修复了它。如何将 IOException 切换为普通 Exception 来解决这样的问题?
就像 IOException 程序说:“嘿,你不会捕捉到错误,但没有错误”,但是 Exception 它说“现在你可以捕捉到它,所以我会继续”。
我的应用程序正在运行,但我无法理解这一点,为什么以及如何发生这种情况?
【问题讨论】:
-
你一直说代码可以工作,但这显然是错误的,否则你就不会在这里。 @twaddington 告诉你问题出在哪里——如果你只捕获一个 IOException,那么你的应用程序在遇到任何其他异常时都会崩溃。相反,捕获异常将捕获所有可能的异常。这就是为什么您的应用不再崩溃的原因,不是因为发生了什么奇怪的事情,而是因为您忽略了所有可能的运行时错误,因此它会默默地继续,但会处于不确定状态。
-
您似乎误解了这个问题。我在这里是因为代码正在运行,但它不应该。我有我想要的功能。一切都在做它应该做的,我一次又一次地测试了这个。我知道服务器应该响应什么,因为我在另一台计算机上将服务器与我的客户端并排放置,并带有其功能的文本文件。我发送一个命令,我得到了正确的响应。我设置了我的坐标,我得到了正确的响应,我用 if 和一个有效的响应的子字符串来拦截它。但从逻辑上讲(对我来说)它不应该工作。
-
好吧,怎么样 - 通过捕获所有异常,您允许启动线程,但您没有正确处理导致抛出异常的错误状态 - 实际上只是忽略它。由于允许线程启动,它会给人一种印象,即只要捕获所有异常,您就已经修复了错误,而实际上您只是忽略了它。正如我在原始评论中所说 - 你只是忽略了问题,而不是解决它。
-
我建议你重新阅读每个人的 cmets,阅读一本关于 Java 异常处理的好书/教程,然后你就会明白为什么你要为以后更令人困惑的错误做好准备。
-
@RivieraKid:但令人惊讶的是,程序的副作用显然正在按预期发生——这绝对是奇怪的,因为我当然不希望这段代码工作.我很困惑为什么这段代码似乎能正常运行——如果我负责维护它,我肯定会重写整个代码,让它按我的预期工作。
标签: android try-catch indexoutofboundsexception