Я получаю исключение при использовании Thread.sleep(x) или wait()
Я попытался задержать или спать - свою программу на Java, но возникает ошибка.
Я не могу использовать Thread.sleep(x)
или wait()
. Появится одно и то же сообщение об ошибке:
незарегистрированное исключение java.lang.InterruptedException; должны быть пойманы или объявлены брошенными.
Есть ли какой-либо шаг перед использованием методов Thread.sleep()
или wait()
?
Ответы
Ответ 1
У вас много чтения перед вами. Из ошибок компилятора с помощью обработки исключений, потоков и прерываний потоков. Но это будет делать то, что вы хотите:
try {
Thread.sleep(1000); //1000 milliseconds is one second.
} catch(InterruptedException ex) {
Thread.currentThread().interrupt();
}
Ответ 2
Как говорят другие пользователи, вы должны окружить свой вызов блоком try{...} catch{...}
. Но поскольку была выпущена Java 1.5, есть класс TimeUnit, который выполняет те же действия, что и Thread.sleep(millis), но более удобен.
Вы можете выбрать единицу времени для операции сна.
try {
TimeUnit.NANOSECONDS.sleep(100);
TimeUnit.MICROSECONDS.sleep(100);
TimeUnit.MILLISECONDS.sleep(100);
TimeUnit.SECONDS.sleep(100);
TimeUnit.MINUTES.sleep(100);
TimeUnit.HOURS.sleep(100);
TimeUnit.DAYS.sleep(100);
} catch (InterruptedException e) {
//Handle exception
}
Также он имеет дополнительные методы:
Документация Oracle TimeUnit
Ответ 3
Посмотрите на этом превосходном коротком сообщении о том, как это сделать должным образом.
По существу: поймайте InterruptedException
. Помните, что вы должны добавить этот catch-блок. Сообщение объясняет это немного дальше.
Ответ 4
Используйте следующую конструкцию кодирования для обработки исключений
try {
Thread.sleep(1000);
} catch (InterruptedException ie) {
//Handle exception
}
Ответ 5
Поместите свой Thread.sleep
в блок catch try
try {
//thread to sleep for the specified number of milliseconds
Thread.sleep(100);
} catch ( java.lang.InterruptedException ie) {
System.out.println(ie);
}
Ответ 6
При использовании Android (единственный раз, когда я использую Java), я бы рекомендовал использовать обработчик вместо того, чтобы помещать поток в режим сна.
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
Log.i(TAG, "I've waited for two hole seconds to show this!");
}
}, 2000);
Ссылка: http://developer.android.com/reference/android/os/Handler.html
Ответ 7
Попробуйте следующее:
try{
Thread.sleep(100);
}catch(Exception e)
{
System.out.println("Exception caught");
}
Ответ 8
Мои способы добавления задержки к программе Java.
public void pause1(long sleeptime) {
try {
Thread.sleep(sleeptime);
} catch (InterruptedException ex) {
//ToCatchOrNot
}
}
public void pause2(long sleeptime) {
Object obj = new Object();
if (sleeptime > 0) {
synchronized (obj) {
try {
obj.wait(sleeptime);
} catch (InterruptedException ex) {
//ToCatchOrNot
}
}
}
}
public void pause3(long sleeptime) {
expectedtime = System.currentTimeMillis() + sleeptime;
while (System.currentTimeMillis() < expectedtime) {
//Empty Loop
}
}
Это для последовательной задержки, но для задержек Loop относятся к Java Delay/Wait.
Ответ 9
public static void main(String[] args) throws InterruptedException {
//type code
short z=1000;
Thread.sleep(z);/*will provide 1 second delay. alter data type of z or value of z for longer delays required */
//type code
}
например: -
class TypeCasting {
public static void main(String[] args) throws InterruptedException {
short f = 1;
int a = 123687889;
short b = 2;
long c = 4567;
long d=45;
short z=1000;
System.out.println("Value of a,b and c are\n" + a + "\n" + b + "\n" + c + "respectively");
c = a;
b = (short) c;
System.out.println("Typecasting...........");
Thread.sleep(z);
System.out.println("Value of B after Typecasting" + b);
System.out.println("Value of A is" + a);
}
}
Ответ 10
Более простой способ подождать - использовать System.currentTimeMillis()
, который возвращает число миллисекунд с полуночи 1 января 1970 года по UTC. Например, подождите 5 секунд:
public static void main(String[] args) {
//some code
long original = System.currentTimeMillis();
while (true) {
if (System.currentTimeMillis - original >= 5000) {
break;
}
}
//more code after waiting
}
Таким образом, вам не нужно гадать с потоками и исключениями.
Надеюсь, это поможет!
Ответ 11
В качестве альтернативы, если вы не хотите заниматься потоками, попробуйте этот метод:
public static void pause(int seconds){
Date start = new Date();
Date end = new Date();
while(end.getTime() - start.getTime() < seconds * 1000){
end = new Date();
}
}
Он запускается, когда вы его вызываете, и заканчивается, когда прошло несколько секунд.