2011-12-21 4 views
2

Я получаю сообщение об ошибке: Метод sleep (int) не определен для типа Thread. Я думал, что метод sleep находится в классе Thread на Java.Java-метод sleep (int) не определен для типа 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) { 
     } 
    } 
} 
+1

На самом деле, почему люди не читают ошибки? –

+0

Я читаю ошибку. Вот почему я копирую и вставляю сообщение об ошибке, которое я получаю. –

+0

Что вы могли бы сделать, это поиск метода в java doc и определение его самостоятельно. в любом случае, хорошо, что вы нашли ответ :) –

ответ

18

вы реализовали свой собственный класс, называемый Thread и попытаться вызвать sleep на него, что не может, потому что sleep не определен в классе. Ваш класс в основном тени java's Thread класса.

Вызовите свой класс по-разному (то есть MyThread или даже лучше MyRunnable, что указано owlstead) или позвоните по телефону java.lang.Thread.sleep().

+4

+1: Хороший пример того, почему вы не должны давать своим классам название стандартных классов. –

+0

Ха-ха. Да. Я выучил свой урок. –

+0

MyThread будет странным именем для чего-то, что реализует Runnable без * бытия * потока. Вместо Runnable вы можете расширить Thread и называть его MyThread (см. JavaDoc для Thread о том, как). Обратите внимание, что для его запуска не вызывайте run(), а вызовите start(), иначе новый поток не будет сгенерирован. Лично я бы так не пошел и придерживался Runnable. –

5

Это не в вашThread класс.

Поскольку вы назвали свой класс Thread, вот где Java будет искать Thread.sleep. Если вам нужна функция, встроенная в Java, попробуйте java.lang.Thread.sleep(time);.

1

Fully-qualify Thread, так как вы пытаетесь использовать java.lang.Thread, а не свои собственные.

2

Ваше имя класса «Тема» конфликтует с классом Thread в стандартной библиотеке Java. Измените имя своего класса, и он разрешит все.

2

Причина, по которой вы получаете это, заключается в том, что вы внедрили свой собственный класс Thread. В вашем классе нет сна.

Первой наградой было бы избежать использования имен классов, которые являются частью стандартных библиотек Java.

Если вы настаиваете на сохранении имен, используйте java.lang.Thread.sleep (...), чтобы указать, что вам нужен класс Thread, который предоставляет Java.

+1

Спасибо всем! Я собираюсь избежать использования стандартных имен Java для имен классов –

1

Проблема в том, что ваш класс называется Thread, который не имеет метода sleep(). Метод сна находится в java.lana.Thread, который скрывается вашим классом.

0

Ответы на этот вопрос уже были опубликованы, еще одна аналогия. Это может быть не прямой ответ, но может помочь вам устранить вашу путаницу, почему бы избежать повторного использования имен классов платформы и никогда не использовать имена классов из java.lang, поскольку эти имена автоматически импортируются повсюду. Программисты используются для просмотра этих имен в их неквалифицированной форме, и естественно предполагают, что эти имена относятся к знакомым классам от java.lang. Если повторное использование одного из этих имен, безоговорочное имя будет ссылаться на новое определение в любое время, когда оно используется внутри его собственного пакета.


Одно имя может использоваться для обозначения нескольких классов в разных пакетах. Следующий простой фрагмент кода исследует, что происходит при повторном использовании имени класса платформы. Что вы думаете ? Посмотри на это. Он повторно использует класс String из пакета java.lang. Попробуйте.

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 

Если вы используете IDE NetBeans, то программа будет просто предотвратить запуск. Вы получите сообщение Не найдено ни одного основного класса.


ВМ не может найти метод main, потому что не существует. Хотя Main имеет метод с именем main, он имеет неправильную подпись. Основной метод должен принимать единственный аргумент, являющийся массивом строк. Что VM пытается сказать нам, что Main.main принимает массив нашей строки класса, который не имеет ничего общего с java.lang.String.


Заключение: Как уже упоминалось выше, всегда во избежание повторного использования имен классов платформы от java.lang пакета.

Смежные вопросы