如何修复调用 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
Rust futures: async fn 中的 thread::sleep 和阻塞调用
如何处理:循环调用'Thread.sleep()',可能是忙等待