программа для записи файлов случайно выходит без ошибок - PullRequest
0 голосов
/ 14 октября 2019

в настоящее время я пытаюсь записать в txt-файл с помощью Java Files-Class. Эта задача должна выполняться каждые 5 секунд и запланирована с помощью ScheduledExecutorService. В течение некоторого времени она выполняет свою работу успешно, но через некоторое время моя программа завершает работу без каких-либо предупреждений, ошибок или чего-то подобного. Я пытался воспроизвести это, но это происходит очень случайно. Я также пытался использовать PrintWriter, но это случайно привело к тому же поведению.

Заранее спасибо !!!

Вот мой код:

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class FileWritingClass
{
    public static void main(String[] args) throws IOException
    {
        ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);

        scheduler.scheduleAtFixedRate(
            new Runnable() {
                long i;
                String str = "";
                Path path = Paths.get("TestFile.txt");

                @Override
                public void run() {

                    str = LocalTime.now().toString() + ": still alive after " + i + " times.";
                    i++;

                    try
                    {   
                        System.out.println(str);
                        Files.write(path, (str + System.lineSeparator()).getBytes(), StandardOpenOption.APPEND);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            },
            500 /* Startdelay */,
            5000 /* period */,
            TimeUnit.MILLISECONDS );        
    }
}

1 Ответ

0 голосов
/ 14 октября 2019

Executor глотает исключения, отличные от IOException. Поймать Throwable вместо просто IOException.

Сбой Executor происходит, когда он сталкивается с каким-то исключением, кроме IOException. Виртуальная машина все еще жива, но Executor не удалось.

Вот некоторый код, который можно попробовать:

                    try
                    {   
                        System.out.println(str);
                        Files.write(path, (str + System.lineSeparator()).getBytes(), StandardOpenOption.APPEND);
                        if(new Random().nextBoolean()) {
                            System.out.println("Here we go.");
                            throw new RuntimeException("Uncaught");
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    } catch(Throwable t) {
                        t.printStackTrace();
                        System.out.println("The show must go on...");
                    }

Обратите внимание, как я даю 50/50 шанс на создание неперехваченного исключения послезапись (только для быстрого отказа). Если вы удалите второй catch, он просто прекратит печать. С catch получается:

12:46:00.780250700: still alive after 0 times.
12:46:05.706355500: still alive after 1 times.
Here we go.
java.lang.RuntimeException:
Uncaught at
KeepaTokenRecorder$FileWritingClass$1.run(KeepaTokenRecorder.java:89)
    at [...]
The show must go on...
12:46:15.705899200: still alive after 3 times.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...