コンテンツにスキップ

9-1. 演習問題


1-1. 次のJavaコードはどうなるか。

String s1 = "hello";
String s2 = new String("hello");
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
  • A. truetrue
  • B. falsetrue
  • C. truefalse
  • D. falsefalse
解答と解説

正解:B

== はオブジェクトの参照(アドレス)を比較する。s1 は文字列リテラルのキャッシュ(文字列プール)にある参照、s2new で別のオブジェクトを作った参照のため、アドレスが異なり false になる。

equals() は文字列の内容を比較するため、同じ内容なら true になる。

Javaの文字列比較は 必ず equals() を使う。== を使うとバグの原因になる。


1-2. 次のコードの出力はどれか。

int x = 10;
double y = x;
System.out.println(y);
  • A. 10
  • B. 10.0
  • C. コンパイルエラー
  • D. 10L
解答と解説

正解:B

int から double への代入は暗黙の型拡大変換が行われる(int の範囲は double の範囲に収まるため)。double 型の値を出力すると小数点以下も表示されるため 10.0 になる。

逆に double から int への代入は精度が落ちるため、明示的なキャストが必要:

double d = 10.9;
int n = (int) d; // 10(小数点以下は切り捨て)

1-3. 次のコードで NullPointerException が発生するのはどの行か。

String s = null; // (A)
int len = s.length(); // (B)
boolean b = s == null; // (C)
String t = s + "suffix"; // (D)
  • A. (A)
  • B. (B)
  • C. (C)
  • D. (D)
解答と解説

正解:B

  • (A):null を代入するだけなのでエラーなし
  • (B):null の参照に対して .length() を呼ぶと NullPointerException
  • (C):== null での比較は null に対して使えるためエラーなし(false / true を返す)
  • (D):Javaでは null + "suffix""null" + "suffix" = "nullsuffix" になる(エラーにならない)

NPEを防ぐには使う前に if (s != null) でチェックするか Optional を使う。


1-4. int 型の変数に格納できる最大値の範囲として正しいものはどれか。

  • A. -128 〜 127
  • B. -32768 〜 32767
  • C. 約 -21億 〜 約 21億
  • D. 約 -92京 〜 約 92京
解答と解説

正解:C

int は 32ビット符号付き整数で、-2^31 (-2,147,483,648) 〜 2^31 - 1 (2,147,483,647)。

  • A は byte(8bit)
  • B は short(16bit)
  • C は int(32bit)← これ
  • D は long(64bit)

Integer.MAX_VALUEInteger.MIN_VALUE で最大値・最小値を確認できる。業務でID管理をする際、数十億を超える可能性があれば long を選ぶ。

2. 次のコードの( )に入る正しいコードを答えよ。

// (1) 浮動小数点型の変数宣言(64bit精度)
1) price = 1980.5;
// (2) 文字列の内容を比較する(== は使わない)
String a = "hello";
String b = "hello";
boolean same = a.(2)(b);
// (3) String.format で "Alice (30歳)" という文字列を作る
String name = "Alice";
int age = 30;
String msg = String.(3)("%s (%d歳)", name, age);
// (4) null 安全に文字列の長さを取得する(null なら 0 を返す)
String s = null;
int len =4)(s != null ? s.length() : 0);
解答欄
解答と解説
  1. double
  2. equals
  3. format
  4. int len =(int) は不要。三項演算子の型は int なのでそのまま代入できる)

解説

(1) double は64bitの倍精度浮動小数点型。float(32bit)との違いは精度。業務では特別な理由がなければ double を使う。

(2) 文字列の内容比較は必ず equals() メソッドを使う。== はオブジェクトの参照を比較するため期待通りに動かないことがある。

(3) String.format(書式, 引数...) でフォーマット文字列を作る。%s は文字列、%d は整数に対応する。

(4) 三項演算子 条件 ? 真の値 : 偽の値 で null チェックしながら値を返す。

3-1. JavaとJavaScriptの「型システム」の違いを、静的型付けと動的型付けの観点から説明せよ。

解答欄
解答と解説

Javaは静的型付け言語

変数宣言時に型を明示し、型チェックはコンパイル時に行われる。

int count = 0;
count = "hello"; // コンパイルエラー:型が合わない
  • メリット:型の不一致によるバグをコンパイル時に検出できる。IDEによる補完・リファクタリングが強力。
  • デメリット:型宣言の記述量が増える。

JavaScriptは動的型付け言語

変数に型はなく、値に型がある。型チェックは実行時に行われる。

let count = 0;
count = "hello"; // エラーなし(実行時に型が変わる)
  • メリット:記述が短く、柔軟な書き方ができる。
  • デメリット:実行するまで型エラーが分からない。大規模開発では TypeScript(型注釈付きのJavaScript)が使われる理由の一つ。

実務的な違い:Javaでは「コンパイルが通れば型に関するバグはない」という安心感がある。JavaScriptはTypeScriptを使うことで静的型付けに近い安全性を得られる。


3-2. 次のコードをコンパイルエラーや実行時エラーが発生しないように修正し、修正の理由を説明せよ。

public class Sample {
public static void main(String[] args) {
double d = 9.99;
int i = d;
System.out.println(i);
}
}
解答欄
解答と解説

修正後のコード:

public class Sample {
public static void main(String[] args) {
double d = 9.99;
int i = (int) d; // 明示的キャスト
System.out.println(i); // 9
}
}

修正の理由:

double から int への代入は縮小変換(情報が失われる可能性がある変換)のため、Javaコンパイラは暗黙の変換を許可しない。

(int) d と明示的にキャストすることで「精度が落ちることを承知の上で変換する」という意図を示す。小数点以下は切り捨てられ、9.999 になる。

丸め処理が必要な場合は (int) Math.round(d) で四捨五入してからキャストする。

下の Java WASM プレイグラウンドでコードを実行し、型・キャスト・文字列比較・null の振る舞いを確認せよ。

  1. まずそのまま実行し、各型の最大値・最小値と比較結果を確認する
  2. doubleint のキャスト結果がどうなるか確認する
  3. ==equals() の違いを出力で確認する
  4. nullStr.length() のコメントを外したときに何が起きるか観察する
Java WASM Playground
ブラウザ内で Java をコンパイルして実行します / 編集内容は自動保存されます / Ctrl+Enter でも実行できます
使い方: 1ファイルならそのまま編集できます。複数ファイルに分けたい場合は // File: Main.java のような行で区切ってください。
出力
「実行」を押すと、ここにコンパイル結果と実行結果が表示されます。
  • Integer.MAX_VALUE のような定数が「型の境界」を調べるのに便利な理由
  • キャストで小数点以下が切り捨てられること
  • NPE は「コンパイル時」ではなく「実行時」に見つかること