Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 需要解释一下吗_Android_Try Catch_Indexoutofboundsexception - Fatal编程技术网

Android 需要解释一下吗

Android 需要解释一下吗,android,try-catch,indexoutofboundsexception,Android,Try Catch,Indexoutofboundsexception,这是我在编程过程中遇到的最奇怪的事情。是的,我不擅长编程,但我在不断学习。我有一个与服务器对话的应用程序,在主线程中有一个套接字,在单独的类和线程中进行读取,在单独的类中使用asynctask进行写入 问题是LocationManager。我可以很好地与服务器对话并编写/读取命令,我实现了LocationManager及其侦听器 然后,我继续实现一种方法,用locatinChanged上的新坐标更新我的textview。到现在为止,一直都还不错。问题是,当我在eclipse中使用Emulator

这是我在编程过程中遇到的最奇怪的事情。是的,我不擅长编程,但我在不断学习。我有一个与服务器对话的应用程序,在主线程中有一个套接字,在单独的类和线程中进行读取,在单独的类中使用asynctask进行写入

问题是LocationManager。我可以很好地与服务器对话并编写/读取命令,我实现了LocationManager及其侦听器

然后,我继续实现一种方法,用locatinChanged上的新坐标更新我的textview。到现在为止,一直都还不错。问题是,当我在eclipse中使用Emulator控件并发送坐标时,应用程序因stringOutOfBoundsException崩溃(我已经编程3年了,现在从未见过这种情况)。我看了看代码,一步一步地通过它,等等。阅读stacktrace、logcat、console和我能想到的任何地方,但我一无所获。直到最后我转到readerthread,它看起来像这样:

    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切换为普通异常如何解决这样的问题

这就像IOException程序说的:“嘿,你不会捕捉到错误,但没有错误”,但它说的是“好吧,现在你可以捕捉到它,所以我会继续”


我的应用程序正在运行,但我无法理解这一点,为什么会发生这种情况,以及如何发生这种情况?

您实际上是在告诉应用程序捕获基本的
异常。这意味着将捕获任何类型的错误,因为所有异常类都是从该基类型派生的。由于
StringOutOfBoundsException
不是从
IOException
派生而来,因此以前没有捕获到它,也没有捕获到错误。您可以尝试以下操作,而不是捕获所有异常:

try {
    // Your code here...
} catch (IOException e) {
    Log.e(TAG, "Caught an IOException!", e);
} catch (StringOutOfBoundsException e) {
    Log.e(TAG, "Caught a string out of bounds Exception!", e);
}

我无法确定到底是什么引发了
StringOutOfBoundsException
。可能是在从示例中删去的if语句中。

实际上是告诉应用程序捕获基本的
异常。这意味着将捕获任何类型的错误,因为所有异常类都是从该基类型派生的。由于
StringOutOfBoundsException
不是从
IOException
派生而来,因此以前没有捕获到它,也没有捕获到错误。您可以尝试以下操作,而不是捕获所有异常:

try {
    // Your code here...
} catch (IOException e) {
    Log.e(TAG, "Caught an IOException!", e);
} catch (StringOutOfBoundsException e) {
    Log.e(TAG, "Caught a string out of bounds Exception!", e);
}
    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");
            }
我无法确定到底是什么引发了
StringOutOfBoundsException
。可能是在if语句中,您从示例中删除了它

    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");
            }
in==null
的测试位于一个有趣的位置。如果该测试在几行之前通过调用方法的性质返回
true
,您应该会收到
NullPointerException
。显然,这段代码有点滑稽

第二次调用时,无法将
中的返回值保存在.readLine()中。我希望它没有包含任何有用的东西。(不过,由于您打印了该行,您显然想知道它包含哪些数据。)

无论
是什么(从第一次调用.readLine()
中的
开始),它都会被丢弃;在循环中没有任何其他内容在该行上被过度写入之前使用它:

                while((line = in.readLine()) != null ){
在这一点上,你读到的两行永远消失了

我不完全确定应该做些什么来解决这个问题;如果是我,我会非常想从一张纸开始,在不查看现有代码的情况下勾画出该方法应该做什么,然后将该勾画与代码进行比较,看看每个人都忽略了哪些情况

in==null
的测试位于一个有趣的位置。如果该测试在几行之前通过调用方法的性质返回
true
,您应该会收到
NullPointerException
。显然,这段代码有点滑稽

第二次调用时,无法将
中的返回值保存在.readLine()中。我希望它没有包含任何有用的东西。(不过,由于您打印了该行,您显然想知道它包含哪些数据。)

无论
是什么(从第一次调用.readLine()
中的
开始),它都会被丢弃;在循环中没有任何其他内容在该行上被过度写入之前使用它:

                while((line = in.readLine()) != null ){
在这一点上,你读到的两行永远消失了


我不完全确定应该做些什么来解决这个问题;如果是我,我会非常想从一张纸开始,在不查看现有代码的情况下勾画出该方法应该做什么,然后将该勾画与代码进行比较,看看每个人都忽略了哪些情况。

是的,我知道这一点。问题是我只是把IOException换成了Exception,没有别的。那么,如果存在错误,是什么导致了错误呢?更改捕获应该修复错误吗?只是捕捉到一个存在的错误,对吗?导致错误的原因是实现了一个locationlistener,它将我的坐标发送到服务器,因此当我使用emulator控件设置坐标时,它在读取responseAppending时崩溃:否如果只捕获传入消息并根据消息的内容将i设置为,如果它不是我想要捕捉的东西,就打印到system.out.println。if是在我修复了错误之后添加的,因此if与我再次读取它无关,yes IOException不会捕获字符串上的outofbound,但是更改catch“修复”了一个显然不存在的问题。通过更改catch和仅更改catch,应用程序工作正常,因此不会出现e