当前位置: 首页 > 面试题库 >

为什么我需要处理Thread.sleep()的异常?

蓟雪峰
2023-03-14
问题内容

要编译此代码,我可以:

  • 将我的通话Thread.sleep()置于try / catch块中,或
  • 已经printAll()声明它可以抛出一个InterruptedException

为什么我必须这样做?

class Test {
    public static void main( String[] args ) {
          printAll( args );
    }

    public static void printAll( String[] line ) {
        System.out.println( lines[ i ] );
        Thread.currentThread().sleep( 1000 ):
    }
}

(示例代码来自Kathy
Sierra的SCJP书
。)

我知道Thread.sleep()引发的异常是已检查的异常,因此我必须处理它,但是在什么情况下Thread.sleep()需要引发此异常?


问题答案:

如果以一种可以引发检查异常的方式声明方法Exception不是的子类RuntimeException),则调用该方法的代码必须在一个try- catch块中调用它,否则调用者方法必须声明以引发它。

Thread.sleep() 声明如下:

public static void sleep(long millis) throws InterruptedException;

它可能会抛出InterruptedException并直接延伸,java.lang.Exception因此您必须抓住它或声明将其抛出。

为什么要这样Thread.sleep()声明?因为如果a
Thread正在睡眠,则该线程可能被Thread.interrupt()另一个线程中断,在这种情况下,睡眠线程(该sleep()方法)将抛出this的一个实例InterruptedException

例:

Thread t = new Thread() {
    @Override
    public void run() {
        try {
            System.out.println("Sleeping...");
            Thread.sleep(10000);
            System.out.println("Done sleeping, no interrupt.");
        } catch (InterruptedException e) {
            System.out.println("I was interrupted!");
            e.printStackTrace();
        }
    }
};
t.start();     // Start another thread: t
t.interrupt(); // Main thread interrupts t, so the Thread.sleep() call
               // inside t's run() method will throw an InterruptedException!

输出:

Sleeping...
I was interrupted!
java.lang.InterruptedException: sleep interrupted
    at java.lang.Thread.sleep(Native Method)
    at Main$1.run(Main.java:13)


 类似资料:
  • 我读了很多关于Java异常处理的帖子,但我确实得到了满意的答案,为什么我要把它们放在我的代码中呢? 我想使用JRE的一些api方法,这些方法是用检查的异常进行的。所以如果我想使用它们,我需要抛出或捕获异常(例如java I/O)。这是在我的类中使用异常的合理规则吗? 我听说了这件事 Java异常处理使错误处理代码与我的业务逻辑分离 在下面的代码段中,分离错误处理的位置在哪里? 3.Java默认的异

  • 问题内容: 当您使用Exception类扩展一个类(用于创建新的异常)时,会收到警告,提示您有一个。我知道这在序列化和反序列化过程中起着重要的作用,但是何时需要序列化我的Exception?谁能给我一个实际的案例,让我的自定义异常类具有序列化和反序列化? 问题答案: 这是因为所有异常的根类都实现了接口。默认情况下,所有异常都是可序列化的,这是一种语言设计决策,因为作者希望异常能够在没有任何特殊配置

  • 问题内容: 我刚开始,最近经历了一个ODM框架。 在文档上,我找不到为什么需要使用。我可以给出的一个原因是,我们可以从定义应用程序架构。 我正在寻找更多可能的原因,以及吸引我使用的需求。 请列出所有可能的优点和使用理由/需要。 问题答案: 主要优势是相对于纯mongo的抽象。 来自SQL数据库类型的许多开发人员对于使用未定义结构的动态集合感到非常不舒服。因此, 模式 首先可以帮助您。 此外,它实现

  • 我的问题是关于,它是从方法抛出的。在使用时,我注意到一些我不理解的奇怪行为;我的意思是: 使用此代码,编译器不会给我任何错误或消息,即应该捕获来自的。但是当我试图改变循环条件并用下面这样的变量替换“true”时: 编译器不断抱怨必须处理。有人能给我解释一下为什么会发生这种情况,为什么如果条件设置为true,编译器会忽略InterruptedException?

  • 问题内容: Angular应用使用属性而不是事件。 为什么是这样? 问题答案: ng-click包含一个角度表达式。Angular表达式是在Angular 范围的上下文中求值的,该范围绑定到具有ng- click属性的元素或该元素的祖先。 Angular表达式语言不包含流控制语句,也不能声明变量或定义函数。这些限制意味着模板只能访问由控制器或指令提供的变量和运行功能。

  • 我用Spring AOP写了一个非常简单的方面。这是可行的,但我在理解到底发生了什么方面有一些问题。我不明白为什么我必须添加aspectjweaver。罐子Spring AOP文档明确指出,只要我只使用Spring AOP,我就不需要aspectj编译器或weaver: 尽管AOP运行时仍然是纯Spring AOP,并且不依赖AspectJ编译器或weaver。 我的配置如下所示: 我也尝试了XM