#java #compiler-errors #runtimeexception
#java #ошибки компилятора #исключение runtimeexception
Вопрос:
В настоящее время я являюсь помощником учителя в классе, который использует Java. Я пытаюсь написать фрагмент кода, который будет проверять правильность методов student, но часто student даже не реализует метод, или они назовут его чем-то неправильным, что, очевидно, вызовет неразрешенную проблему компиляции при запуске моего тестового кода. Есть ли способ поймать эту ошибку во время выполнения, чтобы мой тестовый код мог выполняться без необходимости играть с кодом, представленным студентом?
- редактировать: только что обнаружил, что нерешенная проблема компиляции генерируется компилятором перед выполнением. Имея это в виду, есть ли способ сделать то, что я объяснил выше?
- редактировать: Кроме того, у меня нет никакого контроля над тем, как структурируются назначения, поэтому я не могу вводить интерфейсы или заглушки и т. Д.
Комментарии:
1. разве вы не можете предоставить им интерфейс итерации и «заставить» их реализовать его как часть описания задачи? Я думаю, что это должно быть более простое решение.. :
2. Это определенно было бы лучше, но я должен полагаться на то, что учитель предоставляет для них, и обычно учитель не предоставляет интерфейс.
3. Как вы хотите связать свой верификатор с кодом вашего ученика? Они просто предоставляют метод, затем вы вставляете его в свой исходный код и компилируете? Я думаю, комментарий @amit дает ответ…
4. Пара человек упомянула отражение, и это именно то, что я искал. Вот хорошая ссылка, которую я нашел.
5. Также рассмотрите возможность написания загрузчика классов для извлечения кода из именованного jar.
Ответ №1:
Если бы я был TA, я бы написал несколько модульных тестов и попросил студентов пройти тест. Отправьте их в тестирование на ранней стадии.
Если код не компилируется, нет смысла обнаруживать это во время выполнения. Вы не сможете выполнить, если он не будет компилироваться.
Комментарии:
1. Опять же, я ограничен тем, что реализует учитель. Моя работа — просто оценивать. Это имеет смысл, если я хочу автоматизировать тестовый пример, в котором, если они не реализуют метод, они не получают баллов, но если они реализуют все остальное, то они получают баллы за то, что они делают, без сбоев всех тестов.
2. убедите инструктора, чтобы задания соответствовали структуре модульного тестирования
3. @hvgotcodes Он определенно может работать без компиляции. Нет, если это не основной класс, а другой класс, который вызывается позже. Или он может скомпилироваться и работать отлично, но позже по какой-то причине какой-то дополнительный JAR удаляется, и приложение завершается сбоем во время выполнения
Ответ №2:
Если вы используете отражение, вы можете проверить, существует ли метод, вызвать методы и выполнить итерацию по существующим методам, чтобы, возможно, найти метод студента.
Смотрите класс URLClassLoader для загрузки кода students из файла.
Комментарии:
1. Быстрый поиск в Google по этой теме указывает на то, что отражение — это, возможно, то, что я ищу. Спасибо. Если у вас есть какие-либо хорошие ссылки на размышления, пожалуйста, не стесняйтесь размещать их!
2. Я бы так и сделал, но я на мобильном устройстве =) Сложно получить ссылки на ipod.
Ответ №3:
Если я понимаю ваш вопрос, вы пытаетесь проверить как интерфейс, который реализует студент, так и правильность реализации. API отражения позволит определить, реализовал ли класс правильный API, и если он реализовал, вызвать этот API. Посмотрите на java.lang.Класс, java.lang.Метод и т.д.
Комментарии:
1. Я не знал об отражении. Также спасибо.
Ответ №4:
Похоже, вы уже приступили к объектно-ориентированной части вашего курса. Я думаю, было бы неплохо создать суперкласс, в котором все назначенные методы отключены. Затем учащиеся могут просто расширить этот суперкласс и реализовать методы. Ваши заглушенные должны просто вызывать исключение RuntimeException, которое приведет к сбою соответствующих модульных тестов. Это должно позволить вам создавать модульные тесты, не слишком беспокоясь о том, что учащиеся не реализуют определенные методы.
Комментарии:
1. Звучит как хорошая идея, и это то, что я бы сделал, если бы у меня было больше контроля над назначениями. Я должен внести правку в свой вопрос, указав это, но у меня нет никакого контроля над созданием назначений. Я просто грейдер.