Почему Robot.delay (int ms) ограничен 1 минутой? - PullRequest
5 голосов
/ 19 сентября 2019

При выполнении моего программного обеспечения я получил следующее исключение:

Exception in thread "main" java.lang.IllegalArgumentException: Delay must be to 0 to 60,000ms
    at java.awt.Robot.checkDelayArgument(Robot.java:544)
    at java.awt.Robot.delay(Robot.java:534)
    at com.company.Main.main(Main.java:10)

Меня удивляет, что существует ограничение по времени сна и что в сообщении об исключительной ситуации в стандартной библиотеке имеется неправильная грамматика / опечатка (to 0 to?).После проверки исходного кода метода delay() я заметил, что он ограничивает время ожидания, как указано в исключении:

/**
 * Sleeps for the specified time.
 * To catch any <code>InterruptedException</code>s that occur,
 * <code>Thread.sleep()</code> may be used instead.
 * @param   ms      time to sleep in milliseconds
 * @throws  IllegalArgumentException if <code>ms</code> is not between 0 and 60,000 milliseconds inclusive
 * @see     java.lang.Thread#sleep
 */
public synchronized void delay(int ms) {
    checkDelayArgument(ms);
    try {
        Thread.sleep(ms);
    } catch(InterruptedException ite) {
        ite.printStackTrace();
    }
}

private static final int MAX_DELAY = 60000;

private void checkDelayArgument(int ms) {
    if (ms < 0 || ms > MAX_DELAY) {
        throw new IllegalArgumentException("Delay must be to 0 to 60,000ms");
    }
}

Почему это делается?Похоже, плохой дизайн API.Какую цель он имеет, кроме перехвата избыточного InterruptedException проверенного исключения для вас и синхронизации вызова?

1 Ответ

1 голос
/ 19 сентября 2019

Никто не может ответить на этот вопрос, кроме первоначального разработчика (ей).

Вы можете совершенно ясно видеть, что все, что он делает, это вызывает Thread::sleep, так что просто сделайте то же самое.Вам не нужно звонить Robot::delay.

Следующее точно эквивалентно, без произвольного ограничения

Robot r;
long sleepDuration = 60001;
synchronized (r) {
    try {
        Thread.sleep(sleepDuration);
    } catch(InterruptedException ite) {
        ite.printStackTrace();
    }
}

Похоже, плохой дизайн API

Этому классу 19 лет.В JDK много плохих дизайнерских решений, особенно в старых версиях.

...