Java-программа неожиданно завершает работу без сообщения об ошибке - PullRequest
8 голосов
/ 03 февраля 2010

Я написал Java-программу, которая должна обрабатывать тысячи текстовых файлов (все должны быть загружены в память). Он отлично работает со 123 входными файлами, но когда я запускаю его для обработки около 5000 файлов, он неожиданно завершается в середине пути, не выдавая никаких сообщений об ошибках / исключений. Кто-нибудь может дать мне подсказку о том, что могло пойти не так?

Я использую jdk1.6 на Mac OS Leopard с 2 ГБ ОЗУ.

Ответы [ 5 ]

4 голосов
/ 03 февраля 2010

Учитывая, что это ваша программа, я предлагаю вам сделать следующее:

Сначала измените метод main, чтобы все выполнялось в блоке try / catch, который сообщает обо всех неперехваченных исключениях;например, что-то вроде этого:

public static void main(String[] arghhhhh) {
    try {
        ...
    } catch (Throwable ex) {
        System.err.println("Uncaught exception - " + ex.getMessage());
        ex.printStackTrace(System.err);
    }
}

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

В-третьих, ищите где-нибудь, что вы могли бы вызватьSystem.exit() молча.Это может произойти и в библиотеках ... если вы используете плохо написанную.

Если эти меры не дают вам ответов, попробуйте выяснить, КАК приложение закрывается,

  • путем запуска из отладчика с точками останова, установленными в ключевых точках, или
  • путем добавления операторов печати трассировки в ключевых точках.
3 голосов
/ 03 февраля 2010

Кажется, вы получаете OutofmemoryError.

, если это так, попробуйте увеличить размер кучи памяти.

java -Xms<initial heap size> -Xmx<maximum heap size>
2 голосов
/ 03 февраля 2010

Вы открываете файлы одновременно?Возможно, вам не хватает памяти, если вы загружаете слишком много файлов одновременно.Если файлы достаточно велики, возможно, вам не хватает памяти, если открыт только один файл.Кроме того, убедитесь, что вы закрываете файлы, когда закончите с ними.

1 голос
/ 07 февраля 2017

Есть в основном две причины.

  1. Произошла «необработанная» системная ошибка, т.е. java.lang.OutOfMemoryError.
  2. Произошла ошибка «необработанного» приложения.
  3. Вызван System.exit.

Чтобы справиться с этими сценариями, необходимо выполнить следующие шаги:

  • Найдите в своем коде звонки на System.exit.
  • Убедитесь, что вы обрабатываете все исключения в начальном фрейме стека Java, т. Е. Метод Main:

    попытка { ..код } catch (Throwable t) { t.printStackTrace }

  • Убедитесь, что у вас есть контроль, куда направлены stdout и stderr. Вы можете программно установить их для конкретных файлов:

System.setOut (new PrintStream ("output.txt")); System.setErr (new PrintStream ("err.txt"));

  • Начните с аргументов: -Xloggc: gc.log -XX: + PrintGCDetails -XX: + PrintGCTimeStamps
1 голос
/ 03 февраля 2010

Проверьте, есть ли у вас блоки try / catch, которые не регистрируют исключения правильно.

Скорее всего, это может быть OutofmemoryError. Убедитесь, что консоль не перенаправлена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...