В настоящее время я изучаю сертификацию SCJP с использованием Sierra and Bates Study Guide, и во многих самотестах (имитирующие вопросы экзамена) я продолжаю сталкиваться с одной и той же проблемой - я не могу сказать, будет ли конкретная ошибка во время выполнения ( исключение) или при компиляции (ошибка компиляции). Я знаю, что это немного расплывчатый вопрос и что на него невозможно ответить, но как я могу определить, будет ли обнаружена ошибка при компиляции или во время выполнения? Не могли бы вы прислать мне ссылки на веб-сайты, которые могли бы мне помочь?
Java - когда это ошибка компилятора, а когда исключение во время выполнения?
Ответы (3)
Ошибка времени компиляции - компилятор java не может скомпилировать код, часто из-за синтаксических ошибок. Типичные кандидаты:
- недостающие скобки
- пропущенные точки с запятой
- доступ к приватным полям в других классах
- отсутствующие классы в пути к классам (во время компиляции)
Ошибка выполнения - код компилировался, может быть выполнен, но в какой-то момент дает сбой, например, у вас есть деление на ноль.
- с использованием переменных, которые на самом деле являются
null
(может вызвать исключение NullPointerException) - использование недопустимых индексов на массивах
- доступ к ресурсам, которые в данный момент недоступны (отсутствующие файлы, ...)
- отсутствующие классы в пути к классам (во время выполнения)
(«Сбои» на самом деле неправильный термин и используется только для иллюстрации того, что происходит)
На это нет простого ответа; чтобы увидеть, будет ли что-то компилироваться, вы должны полностью понимать спецификацию языка и задействованный API. По сути, вы должны действовать как компилятор, и никто не может сделать это идеально. Даже компиляторы не всегда полностью следуют спецификации.
В языке Java много, МНОГИЕ угловых случаев. Вот почему такие вещи, как Java Puzzlers, так интригуют: люди не всегда могут сказать, будет ли что-то компилироваться и / или если да, то что на самом деле происходит.
Некоторые из наиболее сложных областей языка Java:
- Generics (Eclipse и
javac
компилятор даже не могут договориться обо всем) - Разрешение перегрузки метода (один из самых сложных для понимания разделов JLS)
Связанные вопросы
instanceof
является ошибкой времени компиляции, а когда она выдает ClassCastException
, возможно? Поищите вокруг и, возможно, уже спросили / ответили, но в любом случае JLS 15.20.2 довольно ясно показывает, как он должен себя вести (java.sun.com/docs/books/jls/third_edition/html/)
- person polygenelubricants; 05.07.2010
Обычно ошибки времени выполнения - это логические ошибки в вашем коде, даже если код синтаксически правильный. Ошибки компилятора относятся к ошибкам в вашем синтаксисе / семантике. Если в вашем коде есть ошибка компилятора, программа никогда не запустится (и проверьте логику кода). Если у вас есть как синтаксические, так и логические ошибки, вы сначала получите ошибку компилятора (синтаксическая ошибка), а затем, когда вы снова запустите код, вы получите ошибку времени выполнения (логическая ошибка).