Ошибка компиляции java

I am currently studying for the SCJP certification using the Sierra and Bates Study Guide and in many of the self tests (mock exam questions) I keep running into the same problem - I can't tell whe...

I am currently studying for the SCJP certification using the Sierra and Bates Study Guide and in many of the self tests (mock exam questions) I keep running into the same problem — I can’t tell whether a particular error will be at runtime (an exception) or at compile (compile error). I know this is a bit of a vague question and that it might not be possible to answer but, how can I tell if an error will be found at compile or at runtime? Would you be able to send me some website links that might be able to help me?

Bill the Lizard's user avatar

asked Jul 5, 2010 at 12:40

Michael's user avatar

4

Compile time error — the java compiler can’t compile the code, often because of syntax errors. Typical candidates:

  • missing brackets
  • missing semicolons
  • access to private fields in other classes
  • missing classes on the classpath (at compile time)

Runtime error — the code did compile, can be executed but crashes at some point, like you have a division by zero.

  • using variable that are actually null (may cause NullPointerException)
  • using illegal indexes on arrays
  • accessing resources that are currently unavailable (missing files, …)
  • missing classes on the classpath (at runtime)

(‘Crashes’ is really not the correct term and is only used to illustrate what happens)

Stephen C's user avatar

Stephen C

688k94 gold badges790 silver badges1200 bronze badges

answered Jul 5, 2010 at 12:44

Andreas Dolk's user avatar

Andreas DolkAndreas Dolk

113k18 gold badges178 silver badges266 bronze badges

3

There is no easy answer to this; to see if something will compile, you have to completely understand the language specification and the API involved. You essentially have to act like a compiler, and no one can do this perfectly. Even compilers don’t always follow the specification perfectly.

There are many, MANY corner cases in the Java language. This is why things like Java Puzzlers are so intriguing: people can’t always tell if something would even compile and/or if it does, what’s really going on.

Some of the more complicated areas of the Java language are:

  • Generics (Eclipse and javac compiler can’t even agree on everything)
  • Method overloading resolution (one of the hardest to understand section of JLS)

Related questions

  • Is 1/0 a legal Java expression?
  • What is the difference between javac and the Eclipse compiler?

Community's user avatar

answered Jul 5, 2010 at 12:43

polygenelubricants's user avatar

3

Basically Runtime errors are logical errors in your code, even if the code is syntactically correct.
Compiler errors refer to errors in your syntax/semantics. If you have a compiler error in your code, the program will never get to run (and check the logic of the code).
If you have both syntactic and logical errors, you will first get the compiler error (syntax error) and then when you run the code again you will get a runtime error (logical error).

answered Nov 20, 2017 at 15:47

JediCate's user avatar

JediCateJediCate

3864 silver badges7 bronze badges

Содержание

  1. How to fix ‘Java: compilation failed: internal java compiler error’?
  2. What causes this error?
  3. How to fix this?
  4. Restart the IDE
  5. Rebuild the project
  6. Try using the terminal
  7. Update JDK
  8. Update your IDE
  9. Give the compiler more storage
  10. Русские Блоги
  11. 「IDEA」Error:java: Compilation failed: internal java compiler error
  12. Проверьте, соответствуют ли эти три места версии SDK самого проекта.
  13. Попробуйте снова!
  14. Проблема с установленным JDK!
  15. Интеллектуальная рекомендация
  16. Реализация оценки приложения iOS
  17. JS функциональное программирование (е)
  18. PWN_JarvisOJ_Level1
  19. Установка и развертывание Kubernetes
  20. На стороне многопроцессорного сервера — (2) *
  21. Русские Блоги
  22. Ошибка IDEA Ошибка: Java: ошибка компиляции: внутренняя ошибка компилятора Java
  23. Интеллектуальная рекомендация
  24. Реализация оценки приложения iOS
  25. JS функциональное программирование (е)
  26. PWN_JarvisOJ_Level1
  27. Установка и развертывание Kubernetes
  28. На стороне многопроцессорного сервера — (2) *
  29. IntelliJ IDEA сообщает мне «Ошибка: Java: Ошибка компиляции: идея внутренней ошибки компилятора Java»
  30. IntelliJ IDEA сообщает мне «Ошибка: Java: Ошибка компиляции: идея внутренней ошибки компилятора Java»
  31. 23 ответа

How to fix ‘Java: compilation failed: internal java compiler error’?

Programming has become far easier as compared to what it used to be back in the day. That said, it’s still fairly difficult and random bugs and glitches are the order of the day.

In this article, we’re talking about the “Java: compilation failed: internal java compiler error” problem when compiling code in Java, its causes and what you can do to fix the issue.

What causes this error?

There are a number of different reasons why your Java compilation might fail, some of the most common ones being.

  • Outdated Java compiler
  • Wrong or corrupt JDK installation.
  • Incorrect installation path.

How to fix this?

Here are six solutions you can try out.

Restart the IDE

One of the first things you should do is try and restart the IDE. More often than not, IDE caches fill up with random files and failed builds over the course of development and restarting can help clear it out, especially if you’re getting build or compilation errors without any reason in particular.

Rebuild the project

Sometimes, the best way around compilation errors is to just try again. Trying a fresh build with the cache files removed and the previous builds cleared can give you a successful compilation.

Try using the terminal

To isolate the issue from your IDE, you can try compiling your code in the terminal (Command Prompt if you’re on Windows) to see if the issue lies in your code, the JDK or your IDE.

To do so, just navigate to the directory where your code is in and run the following command.

If the compilation is successful, you most likely have an issue with your IDE rather than JDK or your code.

Update JDK

Updating your JDK version can also help get rid of uncalled-for compilation issues. Head over to Oracle’s JDK download page and download the x64 installer for the latest JDK version (18.0.2.1 at the time of writing). Install the downloaded installer once the download is complete.

Update your IDE

Another potential fix for the situation can be updating your IDE. As JDK versions and compilers update, your IDE also needs to update to keep up with the latest changes. Using an outdated IDE with a newer version of a programming language it doesn’t exactly support is a recipe for disaster. Not only will you have a horrible code writing experience, but you’ll also run into compatibility issues and build errors like this one.

Give the compiler more storage

Also called the build process heap size, increasing this gives the compiler more headroom when building a program and avoids memory errors. Whether you’re using IntelliJ, BlueJ, NetBeans or Eclipse, most IDEs do have this setting (albeit named differently).

Someone who writes/edits/shoots/hosts all things tech and when he’s not, streams himself racing virtual cars.

You can contact him here: [email protected]

Источник

Русские Блоги

「IDEA」Error:java: Compilation failed: internal java compiler error

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

Error:java: Compilation failed: internal java compiler error

Давайте сначала проверим несколько мест:

Проверьте, соответствуют ли эти три места версии SDK самого проекта.

Попробуйте снова!

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

Если сообщается о той же ошибке, вероятно .

Проблема с установленным JDK!

Удалите исходный JDK, перейдите на официальный сайт Java, чтобы загрузить подлинный JDK, сбросьте переменные среды и повторите попытку!

Автор загрузил поддельный JDK с китайского сайта загрузки, проработал N часов и, наконец, использовал официальный JDK, и, наконец, обнаружил, что это проблема JDK!

Желаю всем удачного кодирования!

Интеллектуальная рекомендация

Реализация оценки приложения iOS

Есть два способа получить оценку приложения: перейти в App Store для оценки и оценка в приложении. 1. Перейдите в App Store, чтобы оценить ps: appid можно запросить в iTunes Connect 2. Встроенная оцен.

JS функциональное программирование (е)

Давайте рассмотрим простой пример, чтобы проиллюстрировать, как используется Reduce. Первый параметр Reduce — это то, что мы принимаем массив arrayOfNums, а второй параметр — функцию. Эта функция прин.

PWN_JarvisOJ_Level1

Nc первый Затем мы смотрим на декомпиляцию ida Перед «Hello, World! N» есть уязвимая_функция, проверьте эту функцию после ввода Видно, что только что появившийся странный адрес является пе.

Установка и развертывание Kubernetes

На самом деле, я опубликовал статью в этом разделе давным -давно, но она не достаточно подробно, и уровень не является ясным. Когда я развернулся сегодня, я увидел его достаточно (хотя это было успешн.

На стороне многопроцессорного сервера — (2) *

Обработка сигнала Родительский процесс часто очень занят, поэтому вы не можете просто вызвать функцию waitpid, чтобы дождаться завершения дочернего процесса. Затем обсудите решение. Обратитесь .

Источник

Русские Блоги

Ошибка IDEA Ошибка: Java: ошибка компиляции: внутренняя ошибка компилятора Java

Ошибка IDEA при выполнении программы

Проанализируйте, что исходному выпуску 1.8 требуется целевой выпуск 1.8, и похоже, что версии совпадают. Но компиляция все же пошла не так. Выполнение компиляции или пакета через maven — это нормально. Эта ошибка возникает только тогда, когда класс, в котором выбрана основная функция, запускается из IDEA. Вы можете определить, что должна быть проблема с настройкой версии Java проекта в IDEA. Определите проблему и начните видеть, что такое установка версии IDEA.

1. Настройки проекта и модуля для версии Java
Файл-> Структура проекта-> Параметры проекта-> Проект, убедитесь, что установлена ​​правильная версия. Авторский проект использует java8

2. ИДЕЯ настройка
Файл-> Настройки-> Сборка, Выполнение, Развертывание-> Компилятор Java, убедитесь, что версия выходных данных компиляции проекта — java8. Моя проблема здесь, она должна быть 1,8, и я не знаю, что Когда установлено на 1.6.

На данный момент проблема решена.
Чтобы подвести итог, запустите программу в IDEA, главным образом, если скомпилированная версия или синтаксис исходного кода не соответствуют версии Java, проверьте эти два места, чтобы убедиться, что версия исходного кода, версия для выполнения является Как и ожидалось.

Прикрепите часть maven. Когда возникает проблема с выполнением программы из IDEA, обычно выполняется компиляция или пакетирование только через maven.

Интеллектуальная рекомендация

Реализация оценки приложения iOS

Есть два способа получить оценку приложения: перейти в App Store для оценки и оценка в приложении. 1. Перейдите в App Store, чтобы оценить ps: appid можно запросить в iTunes Connect 2. Встроенная оцен.

JS функциональное программирование (е)

Давайте рассмотрим простой пример, чтобы проиллюстрировать, как используется Reduce. Первый параметр Reduce — это то, что мы принимаем массив arrayOfNums, а второй параметр — функцию. Эта функция прин.

PWN_JarvisOJ_Level1

Nc первый Затем мы смотрим на декомпиляцию ida Перед «Hello, World! N» есть уязвимая_функция, проверьте эту функцию после ввода Видно, что только что появившийся странный адрес является пе.

Установка и развертывание Kubernetes

На самом деле, я опубликовал статью в этом разделе давным -давно, но она не достаточно подробно, и уровень не является ясным. Когда я развернулся сегодня, я увидел его достаточно (хотя это было успешн.

На стороне многопроцессорного сервера — (2) *

Обработка сигнала Родительский процесс часто очень занят, поэтому вы не можете просто вызвать функцию waitpid, чтобы дождаться завершения дочернего процесса. Затем обсудите решение. Обратитесь .

Источник

IntelliJ IDEA сообщает мне «Ошибка: Java: Ошибка компиляции: идея внутренней ошибки компилятора Java»

Когда я компилирую проект Java с использованием IntelliJ IDEA, он дает мне следующий результат (и ошибку):

Меня это очень смущает! Ниже мои настройки:

  1. В Intellij IDEA Ctrl + Alt + S, чтобы открыть настройки.
  2. Сборка, выполнение, развертывание ->Компилятор ->Компилятор Java
  3. выберите свою версию java из версии байт-кода проекта
  4. Снимите флажок Использовать компилятор из целевого модуля JDK, когда это возможно.
  5. нажмите « Применить» и ОК .

Я решил эту проблему, увеличив значение по умолчанию (700) размера кучи процесса сборки в настройках компилятора IntelliJ.

Я сменил компилятор на Eclipse и запустил свой проект. Впоследствии вернулся к Javac, и проблема была решена. Я не знаю точной проблемы, но это может помочь тем, кто ищет решение.

В моем случае, используя Java 11, у меня было:

и Intellij предложила мне использовать <> вместо GenericType
> , как таковое:

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

В моем случае это было из-за lombok библиотеки с intellij 2019.2 и java11.

Согласно этой ошибке IDEA, идея обходного решения снова работает:

Disable all building from intelliJ and dedicate the build to Maven.

Для меня версия целевого байт-кода модуля была установлена ​​на 5. Я изменил ее на 8, и ошибка исчезла:

В JIdea 2020.1.2 и выше ,

Возможно, уровень языка, установленный в структуре проекта, несовместим с целевой версией байтового кода.

Вам необходимо изменить целевую версию байт-кода.

  1. Зайдите в настройки [Ctrl + Alt + S]
  2. Выберите компилятор Java
  3. Выбрать модуль в таблице
  4. Измените версию байт-кода, чтобы сопоставить то, что вы выбрали на предыдущем шаге для уровня языка

ПРИМЕЧАНИЕ: Как проверить уровень языка

  1. Перейти к структуре проекта [ Ctrl + Alt + Shift + S ]
  2. Выберите подраздел » Модули»
  3. Выберите каждый модуль
  4. В разделе источников проверьте уровень языка

Источник

IntelliJ IDEA сообщает мне «Ошибка: Java: Ошибка компиляции: идея внутренней ошибки компилятора Java»

Когда я компилирую проект Java с использованием IntelliJ IDEA, он дает мне следующий результат (и ошибку):

Меня это очень смущает! Ниже мои настройки:

23 ответа

В моем случае, используя Java 11, у меня было:

И Intellij посоветовал мне использовать <> вместо GenericType
> как таковое:

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

Я решил эту проблему, увеличив значение по умолчанию (700) Размер кучи процесса сборки в настройках компилятора IntelliJ.

Вы должны отключить параметры Javac: по возможности используйте компилятор из целевого модуля JDK.

В моем случае это был тип ответа в restTemplate :

Должно быть так:

Изменение уровня языка в настройках проекта (Ctrl + Alt + Shift + S) на Java 8 решило проблему для меня

В моем случае это было из-за библиотеки lombok с intellij 2019.2 и java11.

Согласно эта ошибка IDEA после того, как идея обходного пути снова работает:

Disable all building from intelliJ and dedicate the build to Maven.

Для меня версия целевого байт-кода модуля была установлена ​​на 5. Я изменил ее на 8, и ошибка исчезла:

Я сменил компилятор на Eclipse и запустил свой проект. Впоследствии вернулся к Javac, и проблема решена. Я не знаю точной проблемы, но это может помочь тем, кто ищет решение.

У меня сработало обновление версии Open JDK

  1. В Intellij IDEA Ctrl + Alt + S откройте настройки.
  2. Сборка, выполнение, развертывание ->Компилятор ->Компилятор Java
  3. выберите свою версию java из Версия байт-кода проекта
  4. Снимите флажок Использовать компилятор из целевого модуля JDK, когда это возможно .
  5. нажмите Применить и ОК .

В JIdea 2020.1.2 и более поздних версиях

Возможно, уровень языка, установленный в структуре проекта, несовместим с целевой версией байт-кода.

Вы должны изменить целевую версию байт-кода.

  1. Перейдите в Настройки [ Ctrl+Alt+S ]
  2. Выберите Компилятор Java .
  3. Выбрать модуль в таблице
  4. Измените версию байт-кода, чтобы сопоставить то, что вы выбрали на предыдущем шаге для уровня языка

ПРИМЕЧАНИЕ: Как проверить уровень языка

  1. Перейдите в Структура проекта [ Ctrl + Alt + Shift + S ]
  2. Выберите подраздел Модули .
  3. Выберите каждый модуль
  4. В разделе источников проверьте уровень языка .

Я столкнулся с той же проблемой

Я решил это, изменив ошибку байт-кода Target с 1,5 до 8.

У меня такая же проблема. Я исправил изменение своих настроек. Целевая версия байт-кода для равной версии байт-кода проекта.

Я получил ту же ошибку с Community edition 2020.3 в Windows 10 с более старой версией JDK (версия openjdk «11» 2018-09-25).

Обновление JDK до javac 11.0.10 устранило проблему.

Вот трассировка стека, которая обнаружилась с ошибкой при использовании openjdk версии «11» 2018-09-25:

В моем случае мне пришлось перейти к help > show logs in files , который открывает папки idea.log и build-log , что-то вроде

/home/user/.cache/JetBrains/IntelliJIdea2021.2/log/build-log/ , где я установил уровень журнала DEBUG в log4j.rootLogger=debug, file в build-log.properties

Затем я снова запустил сборку и увидел

Что привело меня к выводу, что это может быть связано с ошибкой компиляции теста junit. Оказывается, у меня был более старый/несоответствующий винтажный движок и движок Юпитера, которые, вероятно, имеют разные версии Java, связанные с ошибкой выше. Изменение их на одинаковые $ устранило ошибку.

Короче говоря, некоторые из ваших банок зависимостей могут иметь несоответствующие версии Java.

Источник

Содержание

  • 1 Общий принцип
  • 2 Ввод и вывод данных
  • 3 Тестирование решений
    • 3.1 CE — Ошибка компиляции (Compilation Error)
    • 3.2 TLE — Нарушен предел времени (Time Limit Exceeded)
    • 3.3 ILE — Нарушен предел ожидания (Idleness Limit Exceeded)
    • 3.4 MLE — Нарушен предел памяти (Memory Limit Exceeded)
    • 3.5 RTE — Ошибка во время выполнения (Run-time Error)
    • 3.6 PE — Ошибка представления (Presentation Error)
    • 3.7 WA — Неправильный ответ (Wrong Answer)
    • 3.8 OK — Принято (Accepted)
    • 3.9 CF — Ошибка тестирования (Check Failed)
    • 3.10 SV — Нарушение безопасности (Security Violation)
  • 4 Особенности языков программирования
    • 4.1 Выбор языка программирования
  • 5 Конфигурация тестирующего сервера
  • 6 Языки программирования

Общий принцип

В систему посылаются только файлы с исходным кодом, а сама посылаемая программа должна состоять только из одного файла: *.dpr, *.cpp, *.java, *.pas и т. д. Нельзя отправить в систему скомпилированный exe-файл, файл проекта Visual Studio и т. п.

В решениях запрещается:

  • осуществлять доступ к сети;
  • выполнять любые операции ввода/вывода, кроме открывания, закрывания, чтения и записи стандартных потоков stdin, stdout, stderr и файлов с именами, явно прописанными в условии задачи;
  • сознательно «ломать» тестирующую систему;
  • выполнять другие программы и порождать новые процессы;
  • изменять права доступа к файловой системе;
  • работать с поддиректориями;
  • создавать и манипулировать ресурсами GUI (окна, диалоговые сообщения и т. д.);
  • работать со внешними устройствами (звук, принтер и т. д.);
  • выполнять прочие действия, призванные нарушить ход учебного процесса.

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

Ввод и вывод данных

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

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

Внимательно проверяйте имена файлов в решениях на соответствие условию задачи.

Если в коде решения имена файлов указаны неверно, это может приводить к непредсказуемым последствиям. Так, если имя выходного файла указано неверно и требуемый по условию файл не создаётся, система, скорее всего, выдаст вердикт «Ошибка представления».
В случае, когда в решении на Java перепутано имя входного файла и делается попытка открыть несуществующий файл, выбрасывается исключение. Если автор решения не перехватывает его, программа завершается с вердиктом «Ошибка во время выполнения». Если же исключение обрабатывается, то вполне возможны и другие вердикты в зависимости от того, отработает ли программа и что окажется в выходном файле. Если в решении на C++ неправильно указан входной файл и ошибки специально не обрабатываются, чтение из файла может приводить к чтению произвольных данных («мусора»). Если в программе вместо чтения из файла делается попытка считать данные со стандартного ввода (stdin, который обычно связан с клавиатурой консоли), программа заблокируется («повиснет») в ожидании ввода и будет завершена с вердиктом «Превышен предел времени».

Решение может выводить произвольные данные «в консоль», то есть в стандартные потоки stdout, stderr, которые обычно связаны с консольным окном (например для отладки). Это не запрещается и не влияет на результат. Проверяется только содержимое выходного файла. Следует помнить, что на вывод тратится дополнительное время, поэтому большой объём отладочной информации может критически замедлить вашу программу. Вывод в stderr медленнее, чем в stdout, поскольку не буферизируется.

Тестирование решений

Каждое отправленное решение проходит на сервере проверку на нескольких тестах. Задача считается решённой только в случае прохождения всех тестов. Решение запускается на всех тестах, которые есть по задаче, и процесс тестирования не прерывается на первом непройденном тесте, как это делается в соревнованиях типа ACM.

Тестирование осуществляется автоматически, поэтому решения должны строго следовать формату входных и выходных данных, который описан в условии. В случае неясности можно задавать вопросы преподавателям. Если не сказано явно, все входные данные можно считать корректными и удовлетворяющими ограничениям из условия. Например, если сказано, что на входе целое число от 1 до 100 включительно, то можно считать, что это так и есть, и проверять неравенства и выводить ошибку в случае, если это не так, в коде решения нет необходимости.

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

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

Результатом проверки является итоговое сообщение системы и, возможно, в скобках номер первого теста, вызвавшего ошибку (если таковая имела место). Например, вердикт «Неправильный ответ (43)» означает, что решение успешно скомпилировалось и прошло без ошибок первые 42 теста по задаче, но на тесте под номером 43 выдало неверный ответ.

Далее опишем все допустимые сообщения тестирующей системы и укажем возможные причины их появления.

CE — Ошибка компиляции (Compilation Error)

Не удалось скомпилировать решение и получить исполняемый файл для запуска. Решение в таком случае, очевидно, не может быть проверено ни на одном тесте.

Посмотреть вывод компилятора и понять, почему код не удаётся скомпилировать, можно путём нажатия на иконку Compileerror.png в таблице с вашими решениями. Наиболее частые причины ошибки компиляции: выбран неверный компилятор (для другого языка программирования или же несовместимая версия, например Java v7 вместо Java v8), отправляется не тот файл (файл проекта IDE вместо файла с исходным кодом).

Время работы компилятора ограничено 30 секундами. Если он не успел отработать по каким-либо причинам, также будет выставлен вердикт «Ошибка компиляции».

TLE — Нарушен предел времени (Time Limit Exceeded)

Для каждого теста установлено своё ограничение по времени (Time Limit) в секундах. Для разных тестов по одной задаче ограничение по времени может быть разным.

Тестирующая система учитывает так называемое процессорное время (CPU Time) выполнения процесса в операционной системе. Нет смысла делать решение задачи многопоточным, потому что распараллеливание хоть и позволяет сократить реальное время работы (Wall Time), но не уменьшает процессорное время.

Процесс-решение запускается на тесте, и если процесс не успевает завершиться в течение отведённого времени, он принудительно завершается и выставляется вердикт «Нарушен предел времени». В качестве времени работы решения на тесте указывается то время, которое процесс фактически проработал до того, как был приостановлен. Нет возможности узнать, сколько бы программа проработала, если бы не была снята по времени. Если при ограничении по времени на тест в 1 секунду вы видите, что решение получает вердикт «Нарушен предел времени» и работает 1015 мс, то нельзя это понимать как «решение чуть-чуть не успевает, надо ускорить его на 15 мс». Если решение останавливается по времени, то вывод программы никак не проверяется на предмет его правильности.

Возможные причины появления ошибки «Нарушен предел времени»:

  • неэффективный алгоритм (например, в решении реализован алгоритм с временной сложностью Ω(n2), хотя задача предполагает решение за O(n log n));
  • недостаточно эффективная программная реализация (идея и алгоритм правильные, но код написан не очень хорошо: например, ввод данных из файла осуществляется медленно, чрезмерно часто выделяется и освобождается память);
  • попытка чтения данных с консоли (std::cin, scanf(), getchar() в C++, System.in в Java), тогда как нужно читать входные данные из файла (в этом случае программа блокируется в ожидании ввода и зависает, не расходуя при этом CPU Time, поэтому такой случай тестирующая система обрабатывает отдельно);
  • ошибка в программе (например, программа входит в бесконечный цикл).

Не рекомендуется «пропихивать» медленное решение, отправляя его многократно, пока система не «согласится» его принять. Решение в любой момент может быть перетестировано и, соответственно, может перестать быть принятым из-за нарушения предела времени.

ILE — Нарушен предел ожидания (Idleness Limit Exceeded)

Программа зависла в ожидании, не потребляя при этом ресурсы процессора.

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

MLE — Нарушен предел памяти (Memory Limit Exceeded)

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

Ограничение по памяти есть не для всех задач. Гарантируется, что для всех тестов в рамках одной задачи ограничение по памяти одинаково.

Как и в случае нарушения ограничения по времени, программа при нарушении ограничения по памяти аварийно завершается тестирующей системой, её вывод не проверяется на правильность. Точно так же не следует воспринимать размер памяти, использованной до момента аварийного завершения, как объём, которого решению хватило бы для успешной работы. Более точно, вердикт MLE, полученный с использованием 257 МБ памяти, говорит о том, что приложение успело использовать 257 МБ памяти и было принудительно остановлено, но ничего не говорит о том, сколько памяти использовало бы приложение, не будучи принудительно остановленным.

В некоторых случаях при разовом выделении чрезмерно большого блока в памяти, этот запрос может быть не выполнен операционной системой, что в результате может привести к ошибке во время выполнения или (значительно реже) другому результату неопределённого поведения в случае с языком C++.

RTE — Ошибка во время выполнения (Run-time Error)

В операционной системе есть такое понятие, как код завершения процесса (Exit Code). Этот подход используется как в Windows, так и в ОС семейства UNIX. Это целое число, которое остаётся после прекращения выполнения программы. Общепринятое соглашение гласит, что нулевой код завершения свидетельствует о нормальном завершении процесса без ошибок, любой другой — об ошибке. Тестирующая система проверяет код завершения вашего решения, и если он не равен нулю, выставляет вердикт «Ошибка во время выполнения». При этом никак не проверяется то, что решение успело вывести в выходной файл.

Укажем типичные причины ошибок во время выполнения.

  • Использована директива package в коде программы на Java.
    В результате программа на Java находится не в пакете по умолчанию. Компилятор Java сгенерировал класс в некотором пакете (ошибки компиляции нет), а при запуске виртуальная машина Java не смогла найти этот класс, потому что искала в пакете по умолчанию (возникло исключение ClassNotFoundException с сообщением Could not find or load main class).
  • Выход за границы допустимой области памяти в программе на C++.
    Выход за границы массива, разыменование неправильного указателя, обращение к нулевому указателю.
  • Переполнение системного стека.
    Эта причина является частой в случае рекурсии. Вообще, системный стек используется для размещения параметров функций, локальных переменных. Его размер, как правило, невелик и по умолчанию равен 1 МБ. При вызове функции стековая структура позволяет естественным образом сохранить текущие состояния всех локальных переменных и вернуться к ним, когда вызов завершится и управление вернётся в исходную точку. Если в алгоритме используется глубокая рекурсия, то размера стека может не хватить для хранения контекстов всех вызовов. Решений этой проблемы два:

    1. переписать алгоритм нерекурсивно (например с использованием своего стека, а не системного);
    2. увеличить размер системного стека, что делается по-разному для разных языков программирования (см. примеры для C++ (Visual Studio) и Java).
  • Ошибка ввода-вывода (попытка открыть несуществующий входной файл).
    Нужно проверить правильность имени входного файла.
  • Программа целенаправленно была завершена с ненулевым кодом выхода.
    В программе на C++ это может быть, если функция main() в C++ вернула ненулевой код (return (non-zero) в функции main()). Рекомендуется завершать функцию main() оператором return 0 (в старых компиляторах C++ это обязательно, современные компиляторы же подразумевают возврат нулевого кода автоматически). Также программу на C++ с произвольным кодом завершает вызов exit().
    В программе на Java можно завершить процесс с произвольным кодом с помощью System.exit().
  • Необработанное исключение.
    Причин возникновения исключений может быть масса. Например, если в Java функции Integer.parseInt() / Double.parseDouble() была передана строка, содержащая пробельные символы (ASCII-коды 9, 10, 13, 32), выбрасывается исключение NumberFormatException.
  • Целочисленное деление на ноль.
    При выполнении деления нужно всегда думать, а не может ли делитель оказаться равным нулю. В то же время стоит отметить, что вещественное деление на ноль (в типах с плавающей точкой double, float) по умолчанию не приводит к завершению программы, а даёт специальные значения +Inf, -Inf или NaN.

PE — Ошибка представления (Presentation Error)

Наиболее частая причина возникновения этой ошибки — не найден выходной файл. Возможно, вы забыли создать выходной файл и выводите ответ в консоль (он в таком случае игнорируется). Проверьте имена входного и выходного файла в вашей программе на соответствие условию задачи. Исторически сложилось, что в разных задачах входной и выходной файл именуются по разным правилам: input.txt и output.txt, in.txt и out.txt, input.in и output.out (обратите внимание, что нет расширения txt), [задача].in и [задача].out

Для некоторых задач программа проверки (checker) дополнительно удостоверяется, что ваш вывод соответствует определённому формату, и выдаёт ошибку представления в случае, если это не так. Например, если в задаче нужно вывести число, а вы выводите строку. Или если в задаче нужно вывести сначала число k, затем k чисел, а ваше решение выводит число k и далее (k + 1) чисел (то есть решение выводит в файл лишние данные).

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

WA — Неправильный ответ (Wrong Answer)

Для многих задач ответ однозначен, и проверяется просто побайтовое совпадение вашего выходного файла и сохранённого правильного ответа. Такая проверка требует строгого соблюдения формата файла, не допускает незначащих пробелов и пустых строк. Например, если правильный ответ имеет вид (пробелы обозначены символом ␣)

5
1␣2␣3␣4␣5

и решение вывело

5
1␣2␣3␣4␣5␣

(лишний пробел в конце второй строки), то будет получен вердикт «Неправильный ответ». Для некоторых задач написаны проверяющие программы (checker), которые к таким различиям лояльны и засчитывают ответы с лишними пробелами как правильные. Всегда точно следуйте формату файла и не выводите лишних пробелов, и проблем не будет.

После последней строки файла можно выводить или не выводить перевод строки — не важно. Есть две точки зрения в зависимости от того, с какой стороны смотреть на символ перевода строки:

  1. каждая строка завершается переводом строки, поэтому n в конце файла нужен;
  2. перевод строки является разделителем между соседними строками, поэтому n в конце файла не нужен.

Первая точка зрения является общепринятой. Так, компилятор gcc, система контроля версий git и многие другие программы выдают предупреждение no newline at the end of file, если в самом конце файла нет символов новой строки. Обсуждение вопроса можно почитать на stackoverflow.

Поэтому рекомендуется придерживаться первого подхода и завершать все строки переводами строк.

Другие очевидные причины получения неправильного ответа:

  • неверный алгоритм;
  • ошибка в программе.

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

OK — Принято (Accepted)

Программа работает правильно и прошла все тесты с соблюдением всех ограничений.

Если решение принято системой, это ещё не означает, что в его основе лежит правильный алгоритм. В любой момент могут появиться новые наборы входных данных, на которых будут заново протестированы все решения по задаче. Если ваше решение на самом деле не полностью верно и прошло только из-за недостаточно сильного набора тестов, оно может в будущем потерять статус «Принято».

CF — Ошибка тестирования (Check Failed)

Если указан номер теста, то программа успешно завершается на предложенном тесте (укладывается в отведённые время и память и не совершает ошибок во время выполнения), но результат не удаётся проверить из-за ошибок в программе проверки. Вашей ошибки в этом случае, возможно, никакой нет и после исправления программы проверки будет получен вердикт OK. Не исключены ещё два варианта: WA, PE.

Имейте в виду, что если ошибка тестирования возникает на первом же тесте, то на остальных Ваше решение не запускается вовсе. Соответственно, в этом случае после устранения ошибок программы проверки вердикты TLE, MLE, RTE также могут возникнуть в любом тесте, кроме первого.

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

Если у Вас возникла ошибка тестирования, мы, скорее всего, это заметим достаточно быстро. Тем не менее, имеет смысл задать вопрос через пункт «Сообщения» в меню курса. Не забывайте выбрать задачу, которой касается этот вопрос.

SV — Нарушение безопасности (Security Violation)

Ошибка означает, что программа попыталась выполнить запрещённые действия.

К их числу относится попытка создания новых процессов. Вашим решениям запрещено запускать на выполнение другие программы. Например, в коде

порождается новый процесс командной оболочки cmd.exe и в нём выполняется команда pause. Пожалуйста, не пишите так, для достижения аналогичного эффекта можно использовать другие приёмы.

Особенности языков программирования

У каждого конкретного языка программирования есть свои особенности, о которых полезно знать. Далее рассмотрены отдельные особенности написания решений на разных языках программирования:

  • C++;
  • Java;
  • C#;
  • Python.

Выбор языка программирования

Разные задачи можно решать на разных языках. Часто для конкретной задачи тот или иной язык оказывается предпочтительным. Например, если в задаче требуются тяжёлые вычисления, то её может быть проще сдать на C++, чем на Java, за счёт более быстрой работы программы на C++ (для кода на Java могут потребоваться более изощрённые оптимизации, чтобы он прошёл по времени). С другой стороны, если задача требует проведения вычислений с большими целыми числами, выходящими за пределы диапазона 64-битных переменных, то есть «длинной арифметики», то решение существенно проще написать на Java, воспользовавшись готовым качественно написанным классом BigInteger для операций с числами произвольной длины.

Конфигурация тестирующего сервера

Сервер, на котором осуществляется запуск решений, является виртуальной машиной, выполняющейся внутри Microsoft Hyper-V Server 2012 R2. Виртуальный компьютер работает под управлением Windows 7 Professional x64, оснащён процессором Intel® Core™ i3-4130 (Haswell, кэш 3 МБ, 3,40 ГГц, доступно только одно ядро) и 4 ГБ оперативной памяти. Для хранения входных и выходных файлов используется RAM-диск, чтобы обеспечить максимальную производительность ввода-вывода.

Языки программирования

На странице учебного курса в системе на вкладке «Компиляторы» можно ознакомиться с актуальным списком доступных языков программирования, версиями компиляторов и параметрами командной строки их вызова.

Размер системного стека явно не задаётся (используется размер по умолчанию). При компиляции кода на C++ включен режим оптимизации O2.

Понравилась статья? Поделить с друзьями:
  • Ошибка компиляции фильма adobe premiere код ошибки 1609629690
  • Ошибка компилятора cs5001
  • Ошибка компиляции фильма adobe premiere pro код ошибки 3
  • Ошибка компилятора cs0117
  • Ошибка компиляции файла adobe premiere