Создание пользовательского метода для медленной печати текста в Java - PullRequest
0 голосов
/ 25 сентября 2019

Я пытаюсь создать метод в Java, который будет принимать строку для медленной распечатки.Я нашел код для медленной печати здесь ( Медленно печатать текст на Java ) и пытался сделать из него метод, но я все еще очень плохо знаком с Java.Вот мой код

public class propago
{
    public static void main(String[] args)
    {
        String strMessage;  
        strMessage = "Testing 1 2 3";
        slowPrint(strMessage);
    }//end main(String[])

    public static void slowPrint(String[] args) throws InterruptedException
    {
        char[] chars = strMessage.toCharArrray();

        for (int i = 0; i < chars.length; i++)
        {
            System.out.print(chars[i]);
            Thread.sleep(100);
        }
    }//end slowPrint(String[])
}//end propago

Ответ может быть очевидным, но я просто не получаю его.

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

propago.java:12: error: incompatible types: String cannot be converted to String[]

                slowPrint(strMessage);
                          ^
propago.java:17: error: cannot find symbol
                char[] chars = strMessage.toCharArrray();
                               ^
  symbol:   variable strMessage
  location: class propago
Note: Some messages have been simplified; recompile with -Xdiags:verbose to get full output
2 errors

После применения предложенных изменений (надеюсь, правильно) ошибка несовместимых типов была устранена, но я все еще получаю следующую ошибку

propago.java:10: error: cannot find symbol
                char[] chars = strMessage.toCharArray();
                               ^
  symbol:   variable strMessage
  location: class propago
1 error

Вот мой текущий код с внесенными изменениями

public class propago
{
    public static void main(String[] args)
    {
        String strMessage;  
        strMessage = "Testing 1 2 3";
        slowPrint(strMessage);
    }//end main(String[])

    public static void slowPrint(String args)
    {
        char[] chars = strMessage.toCharArray();

        for (int i = 0; i < chars.length; i++)
        {
            System.out.print(chars[i]);
            try {
            Thread.sleep(100);
            } catch (InterruptedException e){
                //Should not happen
            }
        }
    }//end slowPrint(String[])
}//end propago

Ответы [ 4 ]

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

Ваша проблема в том, что slowPrint принимает массив String и может выдавать непроверенное исключение, а именно InterruptedException.

Чтобы решить проблему с массивом String, просто изменитеметод взятия String, а не String[]

В вашем коде нет оснований полагать, что кто-то прервет ваш код (это происходит только в многопоточном коде), поэтому вы можете просто проигнорировать его, перехвативисключение, когда это происходит:

try {
    Thread.sleep(100);
} catch (InterruptedException e) {
    Thread.currentThread().interrupt();
    return;
}

Затем удалите throws InterruptedException из объявления slowPrint.

0 голосов
/ 25 сентября 2019

Это немного выходит за рамки необходимого ответа, но я хотел определить, как бы я подошел к нему: иметь поточно-ориентированный приемник для ваших вызовов.Это может затем поставить в очередь сообщения с соответствующей задержкой в ​​другом потоке:

public class MyLogger {

    private final Logger logger; //some logger
    private final Deque<String> out = new ArrayDeque();
    private final long msgDelayMS; //how long of a time must exist between messages

    public MyLogger(long msgDelayMS) {
        this.msgDelayMS = msgDelayMS;
    }

    public void log(String simpleString) {
        //Use a ReadWriteLock on `out` or somesuch to synchronize the data safely
        this.out.add(simpleString);
    }

    public ScheduledFuture<?> start(ScheduledExecutorService executor) {
        return executor.scheduleAtFixedRate(this::printNext, 0, this.msgDelayMS, TimeUnit.MILLISECONDS);
    }

    private void printNext() {
        //again, synchronize with a `lock` field or somesuch
        String next = this.out.poll();
        if (next == null) {
            return;
        }
        System.out.println(next); //prints however we like our valid queue'd item
    }
}

Я не хотел бы слишком углубляться в детали многопоточности, но в этом у вас, по сути, есть потокобезопасная оболочкадля любой формы ведения журнала вы хотели бы сделать.Тогда его использование будет просто:

MyLogger logger = new MyLogger(1000L); //1000ms delay == 1 second
logger.start(Executors.newSingleThreadScheduledExecutor()); //should keep the executor somewhere
//elsewheres, from any thread, without having to keep track of time or sleep the thread
logger.log("Hello world!");

Это отделяет «выполнение» вашей регистрации и вашу реальную логику программы.Таким образом, могут регистрироваться события, которые произошли 30 секунд назад, если вы зарегистрировали 30 сообщений в определенный момент.Но это делает вашу регистрацию неблокируемой, в том смысле, что вам не нужно ждать, пока это будет подходящее время для печати, вы просто отложите ее для обработки другим потоком.Я полагаю, что этот ответ как бы соблазняет немного духа программирования, а также потому, что в любом случае я в какой-то момент играл с подобной идеей в голове.

0 голосов
/ 25 сентября 2019

попробуйте это:

public class propago
{
    public static void main(String[] args)
    {
        String strMessage;  
        strMessage = "Testing 1 2 3";
        slowPrint(strMessage);
    }//end main(String[])

    public static void slowPrint()
    {
        char[] chars = this.strMessage.toCharArray();

        for (int i = 0; i < chars.length; i++)
        {
            System.out.print(chars[i]);
            try {
            Thread.sleep(100);
            } catch (InterruptedException e){
                //Should not happen
            }
        }
    }//end slowPrint(String[])
}//end propago
0 голосов
/ 25 сентября 2019

Вы должны исправить следующее:

  • slowPrint метод должен принимать String вместо String[]
  • Использовать параметр args в методе slowPrint
  • Метод toCharArrray недопустим.Вместо toCharArray вместо
  • Перехватывать исключение InterruptedException при вызове slowPrint метода
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...