如何修复调用 Thread.sleep() 时未处理异常的编译错误?

Posted

技术标签:

【中文标题】如何修复调用 Thread.sleep() 时未处理异常的编译错误?【英文标题】:How do I fix a compilation error for unhandled exception on call to Thread.sleep()? 【发布时间】:2012-12-09 22:38:28 【问题描述】:

我是 Java 新手,也是编程新手(我知道直接进入 Java 可能不是最好的主意。)无论我如何尝试在我的程序。我正在做一个简单的计数程序,想在每个数字之间添加一秒的延迟,这是我目前拥有的代码:

import java.lang.*;

public class Counter

    public static void main(String[]args)
    
        int i;

        for (i = 0; i <= 10; i++)
        
            Thread.sleep(1000);
            System.out.println(i);
        
        System.out.println("You can count to ten.");
    

Thread.sleep() 的调用无法编译。 javac 编译器说,“未报告的异常 InterruptedException;必须被捕获或声明为抛出”,而 Eclipse 说,“未处理的异常类型 InterruptedException”

【问题讨论】:

那会是什么错误? 编译错误,因为Thread.sleep() 可能会抛出InterruptedException @AndrewLogvinov - 是的,知道......关键是问题需要改进;) 提示,Java.lang.* 不需要为您编写的每个 Java 程序都导入 安德鲁你是对的,它是一个 InterruptedException。谢谢亚历克斯,我正在重用另一个程序哈哈。感谢你们如此迅速地回复。 【参考方案1】:

Thread.sleep 可以抛出一个已检查异常的 InterruptedException。所有检查的异常都必须被捕获和处理,否则您必须声明您的方法可以抛出它。无论是否实际抛出异常,您都需要执行此操作。未声明您的方法可以抛出的已检查异常是编译错误。

你要么需要抓住它:

try 
    Thread.sleep(1000);
 catch (InterruptedException e) 
    e.printStackTrace();
    // handle the exception...        
    // For example consider calling Thread.currentThread().interrupt(); here.

或者声明你的方法可以抛出InterruptedException

public static void main(String[]args) throws InterruptedException

相关

Lesson - Exceptions When does Java's Thread.sleep throw InterruptedException? Java theory and practice: Dealing with InterruptedException

【讨论】:

+1 - 建议对于初学者来说,可能是关于异常的 oracle 教程的链接,并指出 javadoc 说明方法可能抛出的异常。 (编辑:你读懂了我的想法) 感谢 Mark 的回答,但现在你让我想知道为什么我需要首先声明一个例外。 Brian,你不会碰巧有关于异常的 oracle 教程的链接吧? @Mr.Crippled 你错过了这里的重点,声明并不意味着抛出异常,而是可能抛出异常,因此应该被调用者捕获并采取相应的行动(或者你自己在那里捕获它并通过将其包围在 try/catch 块中来采取行动)。现在,还有不需要声明的未经检查的(运行时)异常,例如NullPointerException,是未经检查的异常,不需要声明。为什么这样?经过良好检查的异常让您可以捕获它并对其采取行动,或者让调用者处理它,但对于未经检查的(运行时)异常,您最希望系统失败。【参考方案2】:

你可以去掉第一行。你不需要import java.lang.*;

只需将第 5 行更改为:

public static void main(String [] args) throws Exception

【讨论】:

以上是关于如何修复调用 Thread.sleep() 时未处理异常的编译错误?的主要内容,如果未能解决你的问题,请参考以下文章

NetBeans / Java / 新提示:在循环中调用 Thread.sleep

Thread.sleep() 到摇摆定时器转换

Rust futures: async fn 中的 thread::sleep 和阻塞调用

如何处理:循环调用'Thread.sleep()',可能是忙等待

System.Threading.Thread.Sleep(2000);啥意思,啥用

在 main 方法中调用 Thread.sleep 方法,它会暂停哪个线程?