什么时候到达这个捕获块?

dda*_*son 1 java exception

我已经Thread.sleep出于各种不同的原因使用了,但是我从未理解的一件事是在这个try/catch块期间会发生异常:

try {
    Thread.sleep(1000); // sleep for 1 second.
} catch (Exception x) {
    fail("Failed due to an exception during Thread.sleep!");
    x.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

计算机内实际发生异常的原因是Thread.sleep什么?我最好的猜测是,系统时钟可能只有一次"跳过一个节拍",如心跳,但这种情况经常发生..

所以从本质上讲,我的问题是:执行时Thread.sleep,内部必须发生什么#sleep才能抛出异常?

Kep*_*pil 8

如果您查看JavaDoc,Thread.sleep()您会看到可能发生的情况:

抛出:
IllegalArgumentException - 如果millis的值为负
InterruptedException - 如果任何线程已中断当前线程.抛出此异常时,将清除当前线程的中断状态.

有关如何中断另一个线程的示例可能如下所示:

public class Foo {
    public static void main(final String[] args) throws Exception {
        Thread sleepThread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(10000);
                } catch (InterruptedException e) {
                    System.out.println("Interrupted!");
                }
            }
        });
        sleepThread.start();
        Thread.sleep(500);
        sleepThread.interrupt();
    }
}
Run Code Online (Sandbox Code Playgroud)

这将打印

中断!