Java - когда это ошибка компилятора, а когда исключение во время выполнения?

В настоящее время я изучаю сертификацию SCJP с использованием Sierra and Bates Study Guide, и во многих самотестах (имитирующие вопросы экзамена) я продолжаю сталкиваться с одной и той же проблемой - я не могу сказать, будет ли конкретная ошибка во время выполнения ( исключение) или при компиляции (ошибка компиляции). Я знаю, что это немного расплывчатый вопрос и что на него невозможно ответить, но как я могу определить, будет ли обнаружена ошибка при компиляции или во время выполнения? Не могли бы вы прислать мне ссылки на веб-сайты, которые могли бы мне помочь?


person Michael    schedule 05.07.2010    source источник
comment
Если вы разместили какие-то конкретные вопросы (и свои собственные рассуждения о возможных ответах), мы могли бы помочь лучше.   -  person Péter Török    schedule 05.07.2010
comment
Я не уверен, что этот человеческий навык компилятора настолько полезен, если честно, помимо некоторого базового рабочего понимания языка и API. Практически гарантировано, что всегда будет фрагмент Java, который даже Джеймс Гослинг не может сказать, будет ли он компилироваться и / или что он на самом деле делает.   -  person polygenelubricants    schedule 05.07.2010
comment
Проблема в том, что для SCJP вы действительно должны иметь возможность указать, будет ли ошибка (если таковая имеется) вызываться во время выполнения или при компиляции.   -  person Michael    schedule 05.07.2010
comment
@Peter Torok Мне очень жаль, что мой вопрос был не таким ясным, но его было сложно объяснить. Если вы прочитаете мой комментарий к ответу Andreas_D, я полагаю, это может прояснить ситуацию.   -  person Michael    schedule 05.07.2010


Ответы (3)


Ошибка времени компиляции - компилятор java не может скомпилировать код, часто из-за синтаксических ошибок. Типичные кандидаты:

  • недостающие скобки
  • пропущенные точки с запятой
  • доступ к приватным полям в других классах
  • отсутствующие классы в пути к классам (во время компиляции)

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

  • с использованием переменных, которые на самом деле являются null (может вызвать исключение NullPointerException)
  • использование недопустимых индексов на массивах
  • доступ к ресурсам, которые в данный момент недоступны (отсутствующие файлы, ...)
  • отсутствующие классы в пути к классам (во время выполнения)

(«Сбои» на самом деле неправильный термин и используется только для иллюстрации того, что происходит)

person Andreas Dolk    schedule 05.07.2010
comment
Спасибо, этот ответ очень полезен. Однако иногда кажется, что компилятор знает, что код выйдет из строя во время выполнения, и это ошибка компиляции. В других случаях это похоже на гарантию компилятору того, что то, что вы кодируете, будет работать, а если это не так, код выйдет из строя во время выполнения. (на ум приходит понижение ссылочных переменных) Это то, что затрудняет определение того, будет ли он компилироваться или во время выполнения. - person Michael; 05.07.2010
comment
@Michael: Думаю, ответ в том, что вам просто нужно выучить язык и API, по крайней мере, до той степени, в которой это будет практично. Вы никогда не станете идеальным компилятором, что в любом случае не так уж и полезно. - person polygenelubricants; 05.07.2010
comment
@Michael - одна из заметных ошибок - это ошибка времени компиляции недоступного кода. Если вы видите какой-то код, который подходит для этой ошибки, вы даже не догадываетесь, что он не может быть скомпилирован;) Есть несколько хитрых ошибок, которые вам просто нужно знать - только для SCJP. В реальной жизни вы можете положиться на свою IDE и дружественную JVM ;-) - person Andreas Dolk; 05.07.2010

На это нет простого ответа; чтобы увидеть, будет ли что-то компилироваться, вы должны полностью понимать спецификацию языка и задействованный API. По сути, вы должны действовать как компилятор, и никто не может сделать это идеально. Даже компиляторы не всегда полностью следуют спецификации.

В языке Java много, МНОГИЕ угловых случаев. Вот почему такие вещи, как Java Puzzlers, так интригуют: люди не всегда могут сказать, будет ли что-то компилироваться и / или если да, то что на самом деле происходит.

Некоторые из наиболее сложных областей языка Java:

  • Generics (Eclipse и javac компилятор даже не могут договориться обо всем)
  • Разрешение перегрузки метода (один из самых сложных для понимания разделов JLS)

Связанные вопросы

person polygenelubricants    schedule 05.07.2010
comment
Хотя я не нашел ответ очень ясным и, следовательно, не понял его полностью, я благодарю вас за время, которое вы потратили, и за ваш интерес. - person Michael; 05.07.2010
comment
@Michael: если у вас есть конкретная путаница с примерами, задайте другой вопрос, и я буду более чем счастлив подробно разъяснить, насколько могу. Похоже, у вас есть вопросы о том, когда instanceof является ошибкой времени компиляции, а когда она выдает ClassCastException, возможно? Поищите вокруг и, возможно, уже спросили / ответили, но в любом случае JLS 15.20.2 довольно ясно показывает, как он должен себя вести (java.sun.com/docs/books/jls/third_edition/html/) - person polygenelubricants; 05.07.2010

Обычно ошибки времени выполнения - это логические ошибки в вашем коде, даже если код синтаксически правильный. Ошибки компилятора относятся к ошибкам в вашем синтаксисе / семантике. Если в вашем коде есть ошибка компилятора, программа никогда не запустится (и проверьте логику кода). Если у вас есть как синтаксические, так и логические ошибки, вы сначала получите ошибку компилятора (синтаксическая ошибка), а затем, когда вы снова запустите код, вы получите ошибку времени выполнения (логическая ошибка).

person JediCate    schedule 20.11.2017