Java, программа завершает работу без сообщения об ошибке

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

Я использую jdk1.6 на Mac OS Leopard с 2 ГБ оперативной памяти.

5 ответов


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

во-первых, изменить 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() молча. Это может произойти и в библиотеках ... если вы используете плохо написанный.

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

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

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

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

java -Xms<initial heap size> -Xmx<maximum heap size>

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


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

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


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

  1. произошла" необработанная " системная ошибка, т. е. java.ленг.Исключение OutOfMemoryError.
  2. произошла" необработанная " ошибка приложения.
  3. система.выход вызван.

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

  • посмотрите в вас код для звонков в систему.выход.
  • убедитесь, что вы обрабатываете все исключения в стартовом стеке Java фрейм, т. е. Main-метод:

    попробовать{ ..код }catch (бросаемый t){ Т.печатные }

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