今日もJavaプログラミングの理解を深めましょう!
問題
次のコードを実行した場合、コンパイルエラーとなるのはどれでしょうか?
public class Main {
public static void main(String[] args) {
short a = 10;
int b = a + 5; // 1行目
long c = a * 1000L; // 2行目
float d = a / 0.5; // 3行目
byte e = a * 2; // 4行目
}
}
選択肢
- A. 1行目
- B. 2行目
- C. 3行目
- D. 4行目
答えと解説
回答を見る
答え
C. 3行目
解説
解説のポイント:
- 基本データ型のサイズとプロモーション
- 小数点付きの計算と型変換
- 浮動小数点数型の精度
この問題は、異なるデータ型の演算と型変換に関する問題です。
1行目のレンジでは `short` 型の `a` が `int` に自動的にプロモーションされるため、正常にコンパイルされます。
2行目も問題なく `long` 型への計算が行われますが、3行目では `a / 0.5` の計算結果が `double` になります。
この `double` を `float` に代入しようとするため、暗黙的な型変換ができずエラーが発生します。
4行目では `short` と `int` の演算が `int` にプロモーションされ、一旦`int`になったものを`byte`に代入しようとするためコンパイルエラーが出る可能性がありますが、以下のように心配しなくて大丈夫です。
つまずきポイント:
浮動小数点数の計算結果を他の型に代入することや、整数の「巾乗」が大きすぎて他の型では対処できないケースなど、細かい数値計算の「オーバーフロー」や「データ損失」の危険性に触れる場面が多いです。
また、型変換において「キャスト」が必要とされる場面をしっかりと理解することで、エラー回避の理解が深まります。
発展知識:
Javaでは、全ての整数演算は少なくとも `int` 型で行われ、`long` 型が使用される場合にも `cast` を必要としない形式への変換が起こることを理解することが重要です。
数値計算の関連では、`BigDecimal` や `BigInteger` クラスの使用による高精度計算もありますので、こういった場面に遭遇したときにはリファレンスを参照する習慣を持ちましょう。