Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/182.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
Java 如何处理线程中的异常?_Java_Android_Multithreading_Exception Handling - Fatal编程技术网

Java 如何处理线程中的异常?

Java 如何处理线程中的异常?,java,android,multithreading,exception-handling,Java,Android,Multithreading,Exception Handling,我正在开发一个Android应用程序。我有一个结构如下的线程: code... try code... catch printexception code... try code... catch printexception code.. 当我遇到其中一个异常时,我知道代码的其余部分将无法工作,不应执行。遇到异常时如何停止线程?我必须创建一个包含所有代码的“大尝试”吗?我已经在这样的代码上工作了一段时间,但我以前从未关心过异常。什么是一个好的、干净的方法来实现

我正在开发一个Android应用程序。我有一个结构如下的线程:

code...
try
    code...
catch
    printexception
code...
try
    code...
catch
    printexception
code..

当我遇到其中一个异常时,我知道代码的其余部分将无法工作,不应执行。遇到异常时如何停止线程?我必须创建一个包含所有代码的“大尝试”吗?我已经在这样的代码上工作了一段时间,但我以前从未关心过异常。什么是一个好的、干净的方法来实现这一点?

一般来说,每当你试图编码时,你应该将它们保持在try中,然后在catch下获得结果

就像:

try
{
int x = 5/0;
}
catch(Exception e)
{
e.printStackTrace();
}

通过提及printStackTrace,您可以获得行号以及异常的描述。我希望我把我的观点讲清楚

如果您发布的代码存在于run()方法中,则只要在出现异常时尽早返回即可,从而使线程完成并避免执行随后的任何代码

code...
try {
    code...
} catch (Exception e) {
    e.printStackTrace();
    return;
}
code...
您还可以在异常发生时设置一个标志,并定期检查该标志以确定线程是否应继续运行

bool isCanceled = false;

void run() {
    while (!isCanceled) {
        doSomeWork();
    }
}

void doSomeWork() {
    try {
        code...
    } catch (Exception e) {
        e.printStackTrace();
        isCanceled = true;
        return;
    }
}
当然,您也可以对代码进行结构化,使依赖于上面语句的任何语句也位于try块中。如果发生异常,控制流将转移到catch块,try块中任何紧跟违规行的语句都不会执行。我想这就是你所说的“大尝试”的意思,里面有所有的代码

code...
try
    code...
    try          // this try won't be executed if the line above it throws an exception
        code...
    catch {
        printexception
        return
    }
    code..
catch {
    printexception
    return            // return early
}
code....

这很简单,请尝试以下方法:

public static void main(String[] args) {
    Thread thread = new Thread(new RunnableTest());
    thread.start();
}

static class RunnableTest implements Runnable {

    @Override
    public void run() {
        int i;
        try {
            i = 1 / 0;
        } catch (Throwable t) {
            t.printStackTrace();
            return;
        }
        System.out.println(i);
    }

}

为了更好地控制线程,您可以使用包中的
Executors
ThreadPoolExecutors

为什么不在第一个异常发生时终止线程呢?是的,如果你愿意,你可以在那个时候停止线程。