私は現在、Sierra and Bates Study Guide を使用して SCJP 認定の勉強をしていますが、多くの自己テスト (模擬試験問題) で同じ問題に遭遇し続けています。特定のエラーが実行時に発生するかどうかはわかりません (例外) またはコンパイル時 (コンパイル エラー)。これは少し漠然とした質問であり、答えられない可能性があることは承知していますが、コンパイル時または実行時にエラーが検出されるかどうかはどうすればわかりますか? 私を助けることができるかもしれないいくつかのウェブサイトのリンクを送ってもらえますか?
3 に答える
コンパイル時エラー- 多くの場合、構文エラーが原因で、Java コンパイラがコードをコンパイルできません。典型的な候補:
- ブラケットがありません
- セミコロンがない
- 他のクラスのプライベート フィールドへのアクセス
- クラスパスに欠落しているクラス (コンパイル時)
実行時エラー- コードはコンパイルされ、実行できますが、ゼロ除算のように、ある時点でクラッシュします。
- 実際に変数を使用する
null
(NullPointerException が発生する可能性があります) - 配列で不正なインデックスを使用しています
- 現在利用できないリソースへのアクセス (不足しているファイルなど)
- クラスパスに欠落しているクラス (実行時)
(「クラッシュ」は実際には正しい用語ではなく、何が起こるかを説明するためにのみ使用されます)
これに対する簡単な答えはありません。何かがコンパイルされるかどうかを確認するには、言語仕様と関連する API を完全に理解する必要があります。基本的にコンパイラのように振る舞う必要があり、誰もこれを完璧に行うことはできません。コンパイラでさえ、常に完全に仕様に準拠しているわけではありません。
Java 言語には非常に多くの特殊なケースがあります。これが、Java Puzzlersのようなものが非常に興味深い理由です。人々は、何かがコンパイルされるかどうか、および/またはコンパイルされる場合、実際に何が起こっているのかを常に知ることができるとは限りません。
Java 言語のより複雑な領域には、次のようなものがあります。
- ジェネリック (Eclipse と
javac
コンパイラーはすべてに同意することすらできません) - メソッドのオーバーロードの解決 (JLS の最も理解しにくいセクションの 1 つ)
関連する質問
基本的にランタイム エラーは、コードが構文的に正しい場合でも、コード内の論理エラーです。コンパイラ エラーは、構文/セマンティクスのエラーを指します。コードにコンパイラ エラーがある場合、プログラムは決して実行されません (そしてコードのロジックをチェックします)。構文エラーと論理エラーの両方がある場合、最初にコンパイラ エラー (構文エラー) が発生し、次にコードを再度実行するとランタイム エラー (論理エラー) が発生します。