Java – 方法sleep(int)未定义Thread类型

我收到一个错误:方法sleep(int)未定义Thread类型。 我认为sleep方法在Java中的Thread类中。

import java.util.Random; public class Thread implements Runnable { String name; int time; Random r = new Random(); public Thread(String s){ name = s; time = r.nextInt(999); } public void run() { try{ System.out.printf("%s is sleeping for %d\n", name, time); Thread.sleep(time); System.out.printf("%s is done", name); } catch(Exception e ) { } } } 

你实现了自己的一个名为Thread的类,并尝试在其上调用sleep ,这会失败,导致你的类中未定义sleep 。 你的类基本上影响了java的Thread类。

以不同的方式打电话给你的class级( MyRunnable ,像MyRunnable MyThread或更好的MyRunnable)或直接调用java.lang.Thread.sleep()

它不在你的 Thread类中。

由于您将类命名为Thread ,因此Java将查找Thread.sleep 。 如果你想要内置到Java中的函数,请尝试java.lang.Thread.sleep(time);

您的类名“Thread”与Java标准库中的Thread类冲突。 更改class级的名称,它将解决所有问题。

你得到这个的原因是你已经实现了自己的Thread类。 在你的课堂上没有睡眠方法。

一等奖是避免使用属于标准Java库的类名。

如果您坚持保留名称,请使用java.lang.Thread.sleep(…)指定您希望Java提供的Thread类。

完全限定Thread因为你试图使用java.lang.Thread ,而不是你自己的。

问题是你的类名为Thread ,它没有sleep()方法。 sleep方法在java.lana.Thread ,由您的类隐藏。

这个问题的答案已经发布了另一个类比。 它可能不是直接的答案,但可以帮助您消除混淆为什么应该避免重用平台类的名称,并且永远不要重用java.lang中的类名 ,因为这些名称会自动导入到任何地方。 程序员习惯于以不合格的forms看到这些名称,并自然地假设这些名称引用了java.lang熟悉的类。 如果您重复使用其中一个名称,则非限定名称将在其自己的包中使用时引用新定义。


一个名称可用于引用不同包中的多个类。 以下简单的代码片段探讨了重用平台类名时会发生什么。 你觉得它做什么? 看它。 它重用java.lang包中的String类。 试一试。

 package test; final class String { private final java.lang.String s; public String(java.lang.String s) { this.s = s; } @Override public java.lang.String toString() { return s; } } final public class Main { public static void main(String[] args) { String s = new String("Hello world"); System.out.println(s); } } 

这个程序看起来很简单,如果有点令人厌恶。 未命名包中的String类只是java.lang.String实例的包装器。 程序似乎应该打印Hello world 。 但是,如果您尝试运行该程序,则发现您无法运行该程序。 VM会发出如下错误消息:

 Exception in thread "main" java.lang.NoSuchMethodError: main 

如果您使用的是NetBeans IDE,则只会阻止该程序运行。 您将收到消息未找到主要类


VM无法找到main方法,因为它不存在。 虽然Main有一个名为main的方法,但它的签名错误。 main方法必须接受一个字符串数组的参数。 VM正在努力告诉我们的是Main.main接受我们的String类的数组,它与java.lang.String没有任何关系。


结论:如上所述,始终避免重用java.lang包中的平台类名。