本ブログにはプロモーションが含まれております。

Java

【Javaの型変換】例外とコンパイルエラーが起こるときの違い

スポンサーリンク

こんにちは、まいまいです。

未経験からJavaの文系プログラマになった者です。今は自分Javaのレベルを高めるべく、JavaSilverの勉強をしております。その勉強ですが、Javaの型変換(キャスト)時の挙動が非常に分かりにくくてとても苦戦しました。型変換がおかしかったら例外なんでしょ、と覚えたらコンパイルエラーだったり、やっぱり例外が起きたりといった具合です。

そこで今回は、Javaの型変換時の挙動を完全に分かるようにまとめてみました。JavaSilverを勉強の方や、Java初心者の方向けです。

Javaの型変換(キャスト)時の挙動

まず、Javaの型変換(キャスト)時にはコンパイルエラーと例外の両方が起こりうるものです。どちらか片方だけではないということは押さえておく必要があります。それから2つの違いを覚える必要がありますが、一度理解するともう悩むことはなくなるので、ぜひこの機会に覚えてしまいましょう!

まずコード例を見て確認

見た方が分かりやすい場合もありますので、まずは簡単なコードを使って内容を見てみます。今回はFoodクラス、Ramenクラス、Humanクラスの3つを用意しました。RamenはFoodを継承しています。

class Food{
  //コード
}

class Ramen extends Food{
  //コード
}

class Human{
  //コード
}

public class Main{
  public class void main(String[] args){
    Food food = new Food()     //ok
    Ramen ramen = new Ramen(); //ok
    Human human = new Human(); //ok

    Ramen ramen2 = new Food();  //コンパイルエラー
    Ramen ramen3 = (Ramen)food; //コンパイルok, ただし例外発生

    Food a = new Ramen(); //ok
    Food b = new Human(); //コンパイルエラー
    Food c = (Food)human; //コンパイルエラー
  }
}

なんとなく分かった方もいらっしゃるのではないでしょうか。それでは、詳しく見ていきたいと思います。

コンパイルエラーになる場合

Javaの型変換時にコンパイルエラーになるのは、「明らかに不可能な型変換」を行っている時です。いやどう考えても無理でしょ、となる場合は、たとえ明示的な型変換をしていてもコンパイルエラーになります。先程の例で言うと、

・Ramen ramen2 = new Food();
・Food b = new Human();
・Food c = (Food)human();

のときですね。

1つ目は、RamenとFoodは継承関係にはありますが、明示的に型変換を行っていないダウンキャストなのでアウトです。2つ目は言うまでもありませんね。3つ目は明示的な型変換なので例外が起こると思われがちですが、継承関係もなくそもそも明らかに不可能な型変換なので、コンパイルエラーになります。

例外になる場合

例外になるのは、明示的な型変換で無理やり型を変換してコンパイルを成功させ、それを実行させた時です。明示的な型変換の場合、「もしかしたらできそう…?」と思わせるような場合は、コンパイラは取り敢えずコンパイルします。もしかしたらできそうなのは、クラスが継承関係にあるときですね。先程の例で言うと、

Ramen ramen3 = (Ramen)food;

ですね。

RamenはFoodのサブクラスで一応繋がりがあるため、もしかしたら行けるかも…?と考えられ、ダウンキャストでもコンパイルには成功しますが、実行すると例外が発生します。

明示的な型変換が成功する場合

明示的な型変換が成功し、例外も起こらないパターンは以下のものになります。

Food food = new Ramen();
Ramen ramen = (Ramen)food;

こちらはFood型のfoodに入っているインスタンスがそもそもRamenなので、Ramen型への明示的な型変換が成功します。上記と比較したいコードが以下のコードです。

Food food = new Food();
Ramen ramen = (Ramen)food;

こちらはコンパイルは通りますが、実行時に例外が実行されます。上と下の違いはインスタンスの中身です。

まとめ

Javaの型変換の際に起こるコンパイルエラーと例外についてご紹介しました。明らかにおかしい型変換はコンパイルエラーが起こり、継承関係にあるからなんとなく行けそうなダウンキャストは、コンパイルは成功するも例外が起こります。これら2つを覚えてJavaの型変換をマスターしましょう。最後までお読みいただきありがとうございました!

スポンサーリンク

-Java
-, , , ,

© 2024 教職志望だった文系エンジニア Powered by AFFINGER5