Java
 Computer >> コンピューター >  >> プログラミング >> Java

ClassCastExceptionとは?Javaでスローされる条件と発生例を解説

ClassCastExceptionとは

java.lang.ClassCastExceptionは、Javaにおける非検査例外(unchecked exception)の一つです。プログラムの実行中に、あるクラス型のオブジェクトを互換性のない別のクラス型へ変換(キャスト)しようとした際に発生します。非検査例外のため、コンパイル時には検出されず、実行時に初めてスローされる点に注意が必要です。

ClassCastExceptionがスローされる主なケース

  • 親クラスのオブジェクトを子クラス型にキャストした場合:実際のオブジェクトが親クラスのインスタンスであるにもかかわらず、子クラス型へのダウンキャストを行うと、実行時にこの例外がスローされます。
  • 継承関係にないクラス同士をキャストした場合:一方が他方を継承しておらず、クラス間に何らの関連も存在しない場合、そのようなキャストは不正とみなされ、例外の原因となります。

コード例

class ParentTest {
    String parentName;
    ParentTest(String n1){
        parentName = n1;
    }
    public void display() {
        System.out.println(parentName);
    }
}
class ChildTest extends ParentTest {
    String childName;
    ChildTest(String n2) {
        super(n2);
        childName = n2;
    }
    public void display() {
        System.out.println(childName);
    }
}
public class Test {
    public static void main(String args[]) {
        ChildTest ct1 = new ChildTest("Jai");
        ParentTest pt1 = new ParentTest("Adithya");
        pt1 = ct1;
        pt1.display();

        ParentTest pt2 = new ParentTest("Sai");
        ChildTest ct2 = (ChildTest)pt2;
    }
}

この例では、まずChildTestのインスタンスct1を作成し、親クラス型の変数pt1に代入しています。これは「アップキャスト」と呼ばれる安全な操作であり、正常に動作して「Jai」が出力されます。

一方、後半の処理ではParentTestのインスタンスpt2ChildTest型にキャストしようとしています。しかし、pt2が参照している実際のオブジェクトはParentTestでありChildTestではないため、実行時にClassCastExceptionがスローされます。

実行結果

Jai
Exception in thread "main" java.lang.ClassCastException: ParentTest cannot be cast to ChildTest
        at Test.main(Test.java:30)

例外を回避するには

ダウンキャストを行う前に、instanceof演算子を使用してオブジェクトの実際の型を確認することで、この例外を防ぐことができます。

if (pt2 instanceof ChildTest) {
    ChildTest ct2 = (ChildTest)pt2;
}

このように事前に型チェックを行えば、安全にキャストを実行でき、実行時エラーの発生を未然に防ぐことができます。

  1. JavaにおけるCursorクラスの役割とは?マウスカーソル制御の基本を解説

    JavaのCursorクラスとはCursorクラスは、Objectクラスのサブクラスであり、画面上のポイント(指し示す位置)やインジケーター(表示標識)として定義されます。ユーザーがマウスを使ってシステムへの入力を選択・操作する際に、その位置を視覚的に示す重要な役割を担っています。GUIアプリケーションでは、状況に応じてカーソルの形状を変えることで、ユーザーに対して直感的なフィードバックを提供できます。例えば、処理中であることを伝える砂時計型のカーソルや、クリック可能な要素を示す手型のカーソルなどが代表的な例です。利用可能なカーソルの種類Cursorクラスには、あらかじめ定義されたさまざまなカ

  2. JavaのLayoutManager(レイアウトマネージャー)とは?6つの種類と使い方を解説

    LayoutManager(レイアウトマネージャー)は、GUIフォーム上に視覚コンポーネントをどのように配置するかを制御するための仕組みです。コンテナ内における各コンポーネントのサイズと位置を自動的に決定することで、ウィンドウサイズが変わっても整然としたユーザーインターフェースを維持できます。 LayoutManagerの種類 Javaには、標準で以下の6種類のレイアウトマネージャーが用意されています。 FlowLayout(フローレイアウト):コンポーネントをページ上の文章のように配置します。上段から左から右へ、上から下へと順に詰めていき、追加された順序どおりに並びます。最初のコンポーネン