JavaRush /Java Blog /Random-JA /翻訳: Java の初心者を悩ませる 6 つの Java 例外。
profeg
レベル 18

翻訳: Java の初心者を悩ませる 6 つの Java 例外。

Random-JA グループに公開済み

Java 初心者を悩ませる 6 つの Java 例外。

(原文) (Java も英語も初心者なので、批判や助けをいただければ幸いです) 以前も今も、いくつかの一般的な例外で問題を抱えている多くの Java 初心者に遭遇しますが、これについてはもう一度説明しなければなりません。他の上級 Java 開発者も、初心者がこれらの例外に対処できるように支援しようとして同じ問題を抱えていると思います。したがって、私は自分自身の開発のためにこの記事を書きました。この記事にコメントするか、以下のリストに例外を追加してください。
1.NoClassDefFoundError _
これは、 Java プログラミングの世界でほとんどの新しい Java 開発者が遭遇する、 「スレッド "main" の例外 NoClassDefFoundError」のようなメッセージを伴う例外の 1 つです。初心者は、「Hello world!」を表示するプログラムを作成し、コマンド ラインに移動して「java …」と入力し、Enter キーを押して BAM! =)。そしてプログラムに「Hello world!」を出力させる方法を考え出す。モニター上では時間がかかります。 NoClassDefFoundError は、 Java 仮想マシン (JVM) が起動時にクラスにアクセスしようとしたときに、コンパイル時に同じクラスが見つかったにもかかわらず、そのクラスが見つからなかった場合に発生します。ほとんどの場合、この例外は、「java」コマンドを使用してプログラムを実行しようとしたときにクラスパスが正しく設定されていないときに発生します。この例外が発生する理由について説明します。
  • このクラスは -classpath では使用できません。
  • CLASSPATH 環境変数はオーバーライドされました。Windows コマンドの「set」を使用して、その存在と正確さを確認できます。
問題の解決策については、ここで詳しく説明します
さらに、CLASSPATH 環境変数とインタープリタ キー -classpath の違いを理解する必要があります。専門家は CLASSPATH の使用を推奨しません。最良の方法は、 -classpath キーをインタープリタに渡すことです。
2.クラスノットファウンド例外
ClassNotFoundException も、プログラミングを始めるとすぐに初心者にとって悪夢となる例外です。興味深いことに、平均的な Java 開発者は、 ClassNotFoundException 例外と NoClassDefFoundError 例外の間で混乱することがよくあります。したがって、これら 2 つの例外の違いは、依然として ジュニア職の面接で最もよく聞かれる質問の 1 つですClassNotFoundException は、 JVM が特定のクラスをロードしようとしたときにクラスパス内にそのクラスが見つからなかった場合に発生します。新しい Java 開発者が初めて遭遇する一般的な場所の 1 つは、JDBC ライブラリを使用したデータベースへの接続です。そこで、Class.forName("JDBCdriver") のようなコードを使用してドライバーをロードしようとします。ClassNotFoundException に関する優れた記事は ここにあります。この問題に対処する最も効果的な方法は、 Java クラスローダーの概念を理解しようとすることです。 Win/Unix 環境で Java クラスパスを構成する方法を読むことができます。 Java docsに記載されているように、次の場合に例外が発生します。
  • Class.forName メソッドを使用してクラスをロードしようとしましたが、.class ファイルがクラスパスにありません。これは、ここにリストされている 3 つのシナリオの中で最も一般的なシナリオです。
  • クラスローダーがloadClassを使用してクラスをロードしようとするとき。
  • クラスローダーが findSystemClass を使用してクラスをロードしようとしたとき。
3. NullPointerException
この例外は、最初の 2 つよりも初心者にとって理解しやすいものです。さらに、 この例外は簡単に識別できます。例外が発生すると、例外に関するメッセージに、例外 が発生したプログラム内の行番号が示されます。この例外は、JVM がオブジェクトにアクセスしようとしたり、オブジェクトのメソッドを呼び出そうとしたときに、オブジェクトへの参照ではなく null を受け取ったときに発生します。Java Doc には次の理由も記載されています。
  • 無効なオブジェクトのメソッドにアクセスまたは変更する。(つまり、JVM オブジェクトへの参照の代わりに null を取得します)
  • 配列が無効な場合に配列の長さを取得します。(初期化されていないなど)
  • 存在しない Object 型の配列要素にアクセスしようとしました。(つまり、オブジェクト参照の代わりに配列要素に null が含まれる場合)
この例外を回避する最も簡単な方法は、非 NULL チェックを使用することです。しかし、遅かれ早かれ、これは Java 開発の実践となり、あらゆる場所に非 NULL チェックが挿入されるようになります。興味深いことに、あらゆる 場所に非 NULL チェックを挿入することは、良いプログラミング スタイルとは見なされません。非 NULL チェックを使用する主な理由は、開発者が失敗またはエラーの場合に null オブジェクトを渡したいためです。代わりに、エラーが発生した場合にプログラムがどのように動作するかの基本ロジックとして、プログラマが null 値ではなく空のオブジェクトを返すようにすることは、優れ たプログラミング手法です。ただし、このプログラミング手法を採用することは、思っているよりも困難です。
これに関する優れた記事がリソースにあります。
4.クラスキャスト例外
これも初心者にはよく知られた例外で、オブジェクトをそのサブクラスではないクラスにキャストしようとしたときに発生します。繰り返しますが、これは非常に理解しやすく、特定しやすく、修正も簡単です。実行時にオブジェクトの型が不明な場合にこの例外を回避する 1 つの方法は、 「InstanceOf」を使用してオブジェクトが特定のクラスのインスタンスであることを確認することです。
5. ArrayIndexOutOfBoundsException
この例外は説明のとおりであり、JVM が負の (-1) または配列のサイズ以上のインデックスなど、存在しないインデックスを持つ配列要素にアクセスしようとしたときに発生します。 理解、定義、修正するのは非常に簡単です。たとえば、ループを作成する場合、 for (i = 0; i <= cmd_stack.length; i++) System.out.println(cmd_stack[i]); 配列内のインデックスは 0 から始まり、length メソッドは要素の数を返しますが、その数は最後のインデックスの値より 1 大きいため、例外が発生します。正しい使い方 for (i = 0; i < cmd_stack.length; i++) System.out.println(cmd_stack[i]);
6. IllegalArgumentException
この例外はそれほど一般的ではないため、理解、特定、解決するのは非常に簡単です。これは、JVM が存在しないメソッド、または無効な引数を持つメソッドを呼び出そうとしたときに発生します。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION