Java SE Silver 無料サンプル

Java SE Silver·1Z0-815Oracle公式ドキュメントの出典リンク付き・AI作成の問題演習

登録なしで解ける良問。「正解・解説を見る」で解説とひっかけが開きます。

※ サンプルは実際の例題です。各問の「正解・解説を見る」を開くと、正解・詳細解説・ひっかけが表示されます。 全 30 問のうち 30 問を無料公開しています。
Q1main メソッド(有効なシグネチャ)難易度 標準無料

次の4つの main メソッド宣言のうち、JVM がプログラムのエントリーポイントとして正しく認識できるものをすべて選べ(それぞれ独立したクラスに書かれているものとする)。

A  public static void main(String[] args) { }
B  static public void main(String[] args) { }
C  public void main(String[] args) { }
D  public static void main(String args) { }
  1. Apublic static void main(String[] args) { }
  2. Bstatic public void main(String[] args) { }
  3. Cpublic void main(String[] args) { }
  4. Dpublic static void main(String args) { }
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

JVM が起動時に呼び出すエントリーポイントは、publicstatic・戻り値 void・引数が String[](または可変長引数 String...という条件をすべて満たすメソッドでなければならない。

  • A:条件をすべて満たす標準形。適格。
  • B:修飾子 publicstatic記述順序は自由static public でも public static と同じ意味)。適格。
  • Cstatic が無い。JVM はインスタンス生成無しにクラスから直接呼び出すため、static は必須。不適格(コンパイルは通るが、実行時に「main メソッドが static でない」旨のエラーになる)。
  • D:引数が配列でない単一の String。エントリーポイントの条件を満たさない。不適格。

よって適格なのは A・B

各誤答が違う理由
  • Cstatic が欠けている。JVM はインスタンスを作らずクラスから直接呼び出すため static は必須で、これが無いとエントリーポイントとして認識されない。
  • D引数が String[](配列)や String...(可変長引数)ではなく単一の String。シグネチャが一致しないためエントリーポイントとして認識されない。
ひっかけ: 「修飾子の順序が違うから無効」と早合点しやすいが、public staticstatic public意味的に同一で両方適格。逆に「コンパイルが通る=実行できる」も誤り。C・D はコンパイル自体は通ってもJVMのエントリーポイント要件(static・配列引数)を満たさないため java クラス名 で直接実行できない。
コマンド例と想定される挙動(未実行)
A・B:javac 通過・java コマンドで正常起動。
C:javac 通過だが「main メソッドが static でない」旨の実行時エラー(Error: Main method is not static in class クラス名, please define the main method as:)。
D:javac 通過だが「main メソッドが見つからない」旨の実行時エラー(Error: Main method not found in class クラス名, please define the main method as:)=シグネチャが一致しないため。
公式ドキュメント・関連JLS SE11 §12.1.4 Invoke Test.main
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q2クラス構造(1ファイルに置ける public トップレベル型は1つ)難易度 標準無料

ファイル Q3.java に次のコードが書かれている。コンパイル結果として正しいものを選べ。

1  public class Q3 {
2      public static void main(String[] args) {
3          System.out.println("hi");
4      }
5  }
6  public class Helper {
7      int value;
8  }
  1. Aコンパイルエラー(public なトップレベル型は1ファイルに1つまで)
  2. Bコンパイル成功・実行して hi と出力される
  3. Cコンパイルエラー(1ファイルに2つ以上のクラスを書くこと自体が禁止されている)
  4. Dコンパイル成功。ただし Helper クラスは別ファイルとして自動生成される
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

1つの .java ファイル(コンパイル単位)に複数のトップレベル型(class/interface/enum等)を書くこと自体は可能だが、 public なトップレベル型は1ファイルにつき最大1つという制約がある。さらに、その唯一の public 型はファイル名と同名でなければならない。

本コードには Q3(ファイル名と一致・public)に加え、Helperpublic で宣言されている。 public なトップレベル型が2つ存在するためコンパイルエラーになる。

解決するには Helper から public を外す(パッケージプライベートにする)か、Helper を別ファイル Helper.java に分ける。

各誤答が違う理由
  • BHelperpublic で宣言されており、ファイル名 Q3.java と一致する public 型は1つまでという制約に反するため、コンパイル自体が失敗する。
  • C1ファイルに複数のトップレベルクラスを書くこと自体は合法。禁止されているのは public 型を複数書くことであり、Helperpublic を外せば共存できる。
  • Djavac にそのような自動分割の機能はない。public 型の重複はコンパイルエラーとして検出されるだけで、自動的にファイルが分割されることはない。
ひっかけ: 「1ファイルに複数クラスを書くこと自体が禁止」だと誤解しやすいが、複数クラスを書くこと自体は合法。禁止されているのはpublic なトップレベル型を2つ以上書くことであり、2つ目以降は public を外せば同じファイルに共存できる。
コマンド例と想定される挙動(未実行)
javac でコンパイル:
Q3.java:6: error: class Helper is public, should be declared in a file named Helper.java
public class Helper {
       ^
→ コンパイル不成立(実行に至らない)。
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q3import(ワイルドカードインポートと型名の曖昧性)難易度 高無料

次のコードのコンパイル結果として正しいものを選べ。

1  import java.util.*;
2  import java.sql.*;
3  public class Q4 {
4      public static void main(String[] args) {
5          Date d = new Date();
6          System.out.println(d);
7      }
8  }
  1. Aコンパイルエラー(Date の参照が java.util.Datejava.sql.Date のどちらか曖昧)
  2. Bコンパイル成功。後に書かれた import java.sql.*; が優先され java.sql.Date として解決される
  3. Cコンパイル成功。java.lang と同じパッケージが優先され java.util.Date として解決される
  4. Dコンパイルエラー(java.utiljava.sql を同時にインポートすること自体が禁止されている)
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

ワイルドカードインポート(import パッケージ.*;は、そのパッケージ配下の全ての型を「使用可能な候補」として取り込むだけで、 実際にどの型を指すかはコード中で使われた時点で解決される。

java.utiljava.sql両方に Date という同名クラスが存在する。 両方をワイルドカードインポートした状態で単に Date と書くと、コンパイラはどちらの Date か一意に決定できず曖昧な参照としてコンパイルエラーになる。

解消するには java.util.Date d = new java.util.Date(); のように完全修飾名で指定するか、片方だけを単一型インポート(import java.util.Date;)にする。

各誤答が違う理由
  • Bワイルドカードインポートに「後勝ち」の優先順位は無い。同名クラスが複数パッケージに存在する場合はコンパイラが一意に決定できずコンパイルエラーになる。
  • Cjava.utiljava.sql のどちらも java.lang ではなく暗黙インポートの対象外。両者は対等な候補として扱われ、優先順位による自動解決は行われない。
  • D異なるパッケージを同時にインポートすること自体は合法。問題となるのは、それらの中に同名の型が実在し、かつコード中で曖昧に参照されたことである。
ひっかけ: 「ワイルドカードインポートは名前解決の手間を省くだけで安全」という思い込みが罠。同名クラスが複数パッケージに存在する場合はワイルドカード同士が衝突し、コンパイルエラーになる。単一型インポート(import java.util.Date;)同士で衝突する場合はそもそも記述時点でエラーになる点との違いにも注意(ワイルドカードは"使用時"に判明する)。
コマンド例と想定される挙動(未実行)
javac でコンパイル:
Q4.java:5: error: reference to Date is ambiguous
        Date d = new Date();
        ^
  both class java.util.Date in java.util and class java.sql.Date in java.sql match
→ コンパイル不成立(実行に至らない)。
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q4import(static import による静的メンバの無修飾利用)難易度 標準無料

次のコードの出力として正しいものを選べ。

1  import static java.lang.Math.PI;
2  import static java.lang.Math.sqrt;
3  public class Q5 {
4      public static void main(String[] args) {
5          System.out.println(sqrt(PI) > 0);
6          System.out.println(PI);
7      }
8  }
  1. Atrue 改行 3.141592653589793
  2. Bコンパイルエラー(PIsqrt はクラス名で修飾しないと使えない)
  3. Cfalse 改行 3.141592653589793
  4. Dコンパイルエラー(import static は1ファイルにつき1つまでしか書けない)
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

通常の import が「型(クラス/インタフェース)」を無修飾で使えるようにするのに対し、 import static特定クラスの static メンバ(フィールドやメソッド)を、クラス名で修飾せず直接使えるようにする。

1行目 import static java.lang.Math.PI; により定数 Math.PI を単に PI と書ける。 2行目 import static java.lang.Math.sqrt; により Math.sqrt(...) を単に sqrt(...) と書ける。

PI は正の値であり、sqrt(PI)(平方根)は必ず0より大きいので sqrt(PI) > 0 は常に trueMath.PI の値そのものは 3.141592653589793double 定数)。

各誤答が違う理由
  • Bimport static はまさに「クラス名修飾を省略して使う」ための機能。1〜2行目でその宣言がされているためコンパイルは通る。
  • CPI(正の定数)の平方根は正の値なので sqrt(PI) > 0 は常に truefalse にはならない。
  • Dimport static 宣言は複数書ける(メンバごとに個別に列挙するのが一般的)。1ファイルにつき1つという制限は無い。
ひっかけ: import static は「クラスをインポートする」のではなく「そのクラスの static メンバをインポートする」点に注意。PIsqrt(...) という書き方だけを見て「未定義の変数/メソッドだからコンパイルエラー」と早合点しやすいが、1〜2行目の import static によって正当に解決される。
コマンド例と想定される挙動(未実行)
出力:
true
3.141592653589793
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q5クラス構造(public クラス名とファイル名の一致)難易度 標準無料

ファイル名 Main.java として保存された次のコードのコンパイル結果として正しいものを選べ。

1  public class Runner {
2      public static void main(String[] args) {
3          System.out.println("run");
4      }
5  }
  1. Aコンパイルエラー(public クラス Runner はファイル名と一致していない)
  2. Bコンパイル成功・実行して run と出力される
  3. Cコンパイル成功。ただし実行時は java Runner ではなく java Main と指定する必要がある
  4. Dコンパイルエラー(クラス名に Runner のような一般名詞は使用できない)
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

トップレベル型が public として宣言されている場合、その型名はソースファイル名(拡張子 .java を除いた部分)と完全に一致していなければならない。

本コードのクラス名は Runner だが、ファイル名は Main.java であり一致しない。よってコンパイルエラーになる。

解決するには、ファイル名を Runner.java に変更するか、クラス名を Main に変更する(クラス名を public のまま変えない場合はファイル名の方を合わせるのが一般的)。

各誤答が違う理由
  • Bpublic トップレベルクラスの名前はファイル名と一致必須。RunnerMain.java は一致しないため、コンパイル自体が失敗する。
  • Cそもそもコンパイルが通らないため実行方法以前の問題。public クラス名とファイル名の不一致はコンパイルエラーとして検出される。
  • Dクラス名の語彙自体に制約は無い(予約語でなければ任意の識別子が使える)。エラーの原因はファイル名との不一致であり、名前の意味内容ではない。
ひっかけ: 「クラス名は何でも良く、実行時に java Main と指定すれば動く」は誤り。public トップレベル型はコンパイル時にファイル名との一致が強制される(public でなければファイル名との一致は不要)。
コマンド例と想定される挙動(未実行)
javac Main.java:
Main.java:1: error: class Runner is public, should be declared in a file named Runner.java
public class Runner {
       ^
→ コンパイル不成立(実行に至らない)。
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q6main メソッド(コマンドライン引数配列のインデックス)難易度 標準無料

次のコードを java Q7 hello というコマンドで実行した結果として正しいものを選べ。

1  public class Q7 {
2      public static void main(String[] args) {
3          System.out.println(args.length);
4          System.out.println(args[1]);
5      }
6  }
  1. A1 を出力後、ArrayIndexOutOfBoundsException がスローされる
  2. Bコンパイルエラー(args[1] は範囲外なのでコンパイル時に検出される)
  3. C2 改行 hello(クラス名 Q7 も引数として数えられる)
  4. D1 改行 null(存在しない添字は null を返す)
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

main の引数 args には、java クラス名後ろに続けて書いたコマンドライン引数だけが渡される(実行対象のクラス名自体は含まれない)。

java Q7 hello では引数は "hello" の1個だけなので、args = {"hello"}args.length = 1。 3行目 args.length の出力は1

4行目 args[1]存在しないインデックス(有効なのは args[0] のみ)。配列の範囲外アクセスはコンパイル時には検出されず、実行時に ArrayIndexOutOfBoundsException がスローされる

各誤答が違う理由
  • B配列の範囲チェックは実行時にしか行われない。コンパイラは args の実際の長さを知り得ないため、この行はコンパイル自体には通る。
  • Cargs に渡されるのはクラス名の後ろの引数のみ。java Q7 hello のクラス名 Q7 は含まれず、args.length は1。
  • D配列の範囲外アクセスは null を返すのではなく例外をスローする。null が返るのは、範囲内だが未代入の参照型要素にアクセスした場合など別の状況。
ひっかけ: 配列の添字が「決め打ちの数値」であっても、範囲チェックは実行時にしか行われない(コンパイル時には配列の実際の長さは分からない)。「存在しない添字を書けばコンパイルエラーになる」という思い込みが罠。
コマンド例と想定される挙動(未実行)
出力と例外:
1
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 1
(3行目の 1 は出力された後、4行目で例外が発生し以降は実行されない)
公式ドキュメント・関連ArrayIndexOutOfBoundsException(SE11 API)
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q7メソッド(オーバーロード解決=最小の暗黙拡大変換が優先)難易度 高無料

次のコードの出力として正しいものを選べ。

1  public class Q8 {
2      static void f(long x)   { System.out.println("long"); }
3      static void f(double x) { System.out.println("double"); }
4      static void f(int x)    { System.out.println("int"); }
5      public static void main(String[] args) {
6          byte b = 5;
7          f(b);
8      }
9  }
  1. Aint
  2. Blong
  3. Cdouble
  4. Dコンパイルエラー(f(byte) が複数の候補と曖昧になる)
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

byte 型の実引数に対して f(int)f(long)f(double) のいずれも暗黙の拡大変換(widening)で呼び出し可能であり、複数のオーバーロードが候補になる。

このように複数の候補がある場合、コンパイラは最も小さい(変換段階の少ない)拡大変換で到達できるオーバーロードを優先する。 プリミティブの拡大変換の順序は byte → short → int → long → float → double

byte から最も近い(変換1段階)候補は int であり、longdouble はさらに遠い(変換段階が多い)。 よってコンパイラは f(int) を選択し、出力は int になる。

各誤答が違う理由
  • Bbyte から int への変換の方が long への変換より段階が少なく近い。より近い f(int) が優先される。
  • Cdoublebyte→short→int→long→float→double の中で最も遠い変換。他に近い候補(int)がある限り選ばれない。
  • D拡大変換で到達できる候補が複数あっても、最も近い変換のオーバーロードが一意に決まるため曖昧エラーにはならない。
ひっかけ: 「複数のオーバーロードに解決可能だから曖昧でコンパイルエラー」と考えがちだが、拡大変換の距離が最も近いものが一意に選ばれるため曖昧にはならない。オートボクシング(byte→Byte等)や可変長引数はさらに優先度が低く、拡大変換で解決できる限りそちらが優先される。
コマンド例と想定される挙動(未実行)
出力:
int
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q8クラス構造(static初期化子・インスタンス初期化子・コンストラクタの実行順序)難易度 高無料

次のコードの出力として正しいものを選べ。

1  public class Q9 {
2      static { System.out.print("S"); }
3      { System.out.print("I"); }
4      public Q9() { System.out.print("C"); }
5      public static void main(String[] args) {
6          new Q9();
7          new Q9();
8      }
9  }
  1. ASICIC
  2. BSSICIC(static初期化子は new のたびに走る)
  3. CSCICI(コンストラクタがインスタンス初期化子より先に実行される)
  4. DICICS(static初期化子は最後にまとめて実行される)
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

クラスには3種類の初期化コードがあり、実行タイミングが異なる。

  • static 初期化子static { ... }):クラスが最初にロードされた時に1回だけ実行される。
  • インスタンス初期化子{ ... }):インスタンスが生成されるたびに、コンストラクタ本体の実行よりに実行される。
  • コンストラクタ:インスタンス初期化子の後に実行される。

main 実行時、Q9 クラスが初めてロードされ static 初期化子が1回だけ走り "S" を出力。 その後 new Q9() のたびに「インスタンス初期化子→コンストラクタ」の順で "I""C" が出力される。 2回の new Q9() でこれが2セット走るので、全体は "S" + "IC" + "IC"SICIC

各誤答が違う理由
  • Bstatic初期化子はクラスロード時に1回だけ実行される。何度 new しても再実行されない。
  • C実行順は「インスタンス初期化子→コンストラクタ本体」。コンストラクタが先に走ることはない。
  • Dstatic初期化子はクラスが最初にロードされる時点(1回目の new より前)で実行される。最後にまとめて走るのではない。
ひっかけ: 「static初期化子もインスタンス生成のたびに走る」「インスタンス初期化子はコンストラクタの後に実行される」という2点の誤解が典型的な罠。static はクラスにつき1回のみ、インスタンス初期化子はコンストラクタより先に実行される。
コマンド例と想定される挙動(未実行)
出力:
SICIC
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q9import(完全修飾名によるインポート省略)難易度 標準無料

次のコードの出力として正しいものを選べ(import 文は一切書かれていない)。

1  public class Q10 {
2      public static void main(String[] args) {
3          java.util.List<Integer> list = new java.util.ArrayList<>();
4          list.add(42);
5          System.out.println(list);
6      }
7  }
  1. A[42]
  2. Bコンパイルエラー(import java.util.List;import java.util.ArrayList; が無い)
  3. C42(角括弧は付かない)
  4. D実行時に NoClassDefFoundError が発生する(java.util は事前インポート必須)
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

import は「毎回完全修飾名を書く手間を省くための構文糖衣」であり、必須ではない。 型を使用するたびに完全修飾名(パッケージ名を含むフルネーム)で記述すれば、import 文が無くてもコンパイル・実行できる。

本コードは java.util.Listjava.util.ArrayList をそれぞれ完全修飾名で記述しており、意味的には import java.util.*; をした上で ListArrayList と書くのと同じ。 list.add(42) でオートボクシングされた Integer(42) が追加され、listtoString()AbstractCollection 由来)は要素をカンマ区切りで [ ] 内に出力する。

各誤答が違う理由
  • B完全修飾名で書けば import は不要。java.util.Listjava.util.ArrayList と正しく完全修飾されているためコンパイルは通る。
  • CListtoString() はコレクションの内容を [ ] で囲んで表示する仕様。単一の数値だけが出力されるわけではない。
  • Djava.util パッケージのクラスは標準ライブラリに含まれ、完全修飾名で参照する限り解決に失敗することはない。
ひっかけ: 「import が無いコードはコンパイルできない」という思い込みが罠。java.lang パッケージ(String 等)だけが唯一暗黙にインポートされているが、それ以外のパッケージも完全修飾名を使えば import 無しで参照可能
コマンド例と想定される挙動(未実行)
出力:
[42]
公式ドキュメント・関連JLS SE11 §6.5.5 Meaning of Type Names
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q10プリミティブ型(byte の範囲と定数式の代入変換)難易度 高無料

次のコードのコンパイル結果として正しいものを選べ。

1  public class Q11 {
2      public static void main(String[] args) {
3          byte b1 = 127;
4          byte b2 = 128;
5          System.out.println(b1);
6      }
7  }
  1. Aコンパイルエラー(128byte の範囲(-128〜127)を超える)
  2. Bコンパイル成功・実行して 127 と出力される
  3. Cコンパイル成功。b2 は自動的にオーバーフローし -128 になる
  4. Dコンパイルエラー(byte にはリテラルで初期値を代入できない)
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

byte の表現範囲は -128 〜 127(符号付き8ビット)。

リテラルの右辺がコンパイル時定数式であり、かつ代入先の型の範囲に収まる場合に限り、明示的なキャスト無しで int リテラルを byte 変数へ代入できる(縮小変換の特例)。

3行目 byte b1 = 127; は範囲の上限ちょうどなので適格。 4行目 byte b2 = 128;128byte の範囲(最大127)を超えているため、この特例が適用できずコンパイルエラーになる。

各誤答が違う理由
  • B4行目の byte b2 = 128; の時点で 128 が byte の範囲を超えるためコンパイル自体が失敗する。3行目だけを見て通ると判断するのは誤り。
  • C暗黙の変換(キャスト無し)では範囲外の定数はコンパイルエラーになる。オーバーフローが起きるのは明示的にキャスト((byte) 128)した場合のみ。
  • D3行目 byte b1 = 127; のように範囲内のリテラルであれば正常に代入できる。エラーの原因はリテラル代入そのものではなく範囲超過。
ひっかけ: 「リテラルが小さい数値に見えるから何でも byte に入る」という誤解が罠。境界は127までであり、128はすでに範囲外。キャストを付けて byte b2 = (byte) 128; と書けば強制的に代入できるが、その場合はオーバーフローして値が -128 になる(今回のコードにはキャストが無いためコンパイルエラーで止まる)。
コマンド例と想定される挙動(未実行)
javac でコンパイル:
Q11.java:4: error: incompatible types: possible lossy conversion from int to byte
        byte b2 = 128;
                  ^
→ コンパイル不成立(実行に至らない)。
公式ドキュメント・関連JLS SE11 §5.2 Assignment Contexts
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q11リテラル(数値リテラルのアンダースコア区切り)難易度 高無料

次のコードのコンパイル結果として正しいものを選べ。

1  public class Q12 {
2      public static void main(String[] args) {
3          int a = 1_000_000;
4          double d = 3_14.159;
5          long L1 = 9_999_999_999L;
6          float f = 10_00_.5f;
7          System.out.println(a);
8      }
9  }
  1. Aコンパイルエラー(6行目・アンダースコアが小数点の直前にある)
  2. Bコンパイルエラー(4行目・小数部の途中にアンダースコアは置けない)
  3. Cコンパイルエラー(5行目・L サフィックスの直前にアンダースコアは置けない)
  4. Dすべての行が正しくコンパイルできる
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

数値リテラルには可読性のためにアンダースコア(_)を桁区切りとして挿入できるが、挿入できる位置には制約がある。 禁止位置は「リテラルの先頭・末尾」「小数点(.)の直前直後」「Lfd などの型サフィックスの直前」「基数プレフィックス(0x0b)の直後」。それ以外の数字と数字の間であれば自由に置ける。

  • 3行目 1_000_000:数字同士の間のみ。適格。
  • 4行目 3_14.159:アンダースコアは 314 の間(数字同士)にあり、小数点には接していない。適格。
  • 5行目 9_999_999_999L:どのアンダースコアも数字同士の間で、L サフィックスの直前は数字(9)。適格。
  • 6行目 10_00_.5f:末尾のアンダースコア _小数点 . の直前に置かれている。これは禁止位置でありコンパイルエラーになる。

6行目のみが不正であり、そこでコンパイルが失敗する。

各誤答が違う理由
  • B4行目のアンダースコアは 314 という数字同士の間にあり、小数点には接していない。禁止位置に該当せず適格。
  • C5行目の L の直前は数字 9 であり、アンダースコアではない。サフィックス直前にアンダースコアがあるわけではないため適格。
  • D6行目 10_00_.5f は末尾のアンダースコアが小数点の直前に位置しており、この配置は禁止されているためコンパイルエラーになる。
ひっかけ: 「アンダースコアは数字が並ぶところならどこでも良い」という思い込みが罠。小数点・型サフィックス・基数プレフィックスに隣接する位置だけは禁止されている。5行目の L の直前は数字なので合法だが、6行目は小数点の直前にアンダースコアがあるため不合法、という違いを見抜く必要がある。
コマンド例と想定される挙動(未実行)
javac でコンパイル:
Q12.java:6: error: illegal underscore
        float f = 10_00_.5f;
                        ^
→ コンパイル不成立(実行に至らない)。
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q12リテラル(整数リテラルの既定型と L サフィックス)難易度 標準無料

次のコードのコンパイル結果として正しいものを選べ。

1  public class Q13 {
2      public static void main(String[] args) {
3          long x = 3000000000;
4          System.out.println(x);
5      }
6  }
  1. Aコンパイルエラー(L サフィックスが無く、リテラルが int の範囲を超えている)
  2. Bコンパイル成功・実行して 3000000000 と出力される
  3. Cコンパイル成功。ただし値はオーバーフローして負の値になる
  4. Dコンパイルエラー(long 型の変数は数値リテラルで初期化できない)
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

整数リテラル(L サフィックスの無いもの)は既定で intとして解釈される。これは代入先の変数の型(ここでは long)とは無関係で、リテラル自体が先に int として評価される。

int の表現範囲は約 -21億〜+21億(正確には -2147483648 〜 2147483647)。3000000000 はこの範囲を超えているため、 リテラルの時点で「too large」なリテラルとしてコンパイルエラーになる。long 型の変数へ代入しようとしていることは救済にならない。

正しく書くには long x = 3000000000L; のようにL サフィックスを付け、リテラル自体を long として扱わせる必要がある。

各誤答が違う理由
  • B代入先が long であってもリテラル自体は既定で int として解釈される。int の範囲を超える値はサフィックスを付けない限りコンパイルエラーになる。
  • Cオーバーフローが発生するのはコンパイルが通った後の実行時の話。本コードはリテラルの時点で int 範囲外と検出され、そもそもコンパイルが失敗する。
  • DL サフィックスを付けたリテラル(例:3000000000L)であれば long 変数の初期化に問題なく使える。エラーの原因はサフィックス無しでの範囲超過。
ひっかけ: 「代入先が long だからリテラルも自動的に long として扱われる」という誤解が罠。リテラルの型はサフィックスだけで決まり、代入先の型は無関係。L(小文字の l は数字の1と紛らわしいため非推奨)を付け忘れると int の範囲チェックで弾かれる。
コマンド例と想定される挙動(未実行)
javac でコンパイル:
Q13.java:3: error: integer number too large: 3000000000
        long x = 3000000000;
                 ^
→ コンパイル不成立(実行に至らない)。
公式ドキュメント・関連JLS SE11 §3.10.1 Integer Literals
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q13リテラル(浮動小数点リテラルの既定型と f サフィックス)難易度 標準無料

次のコードのコンパイル結果として正しいものを選べ。

1  public class Q14 {
2      public static void main(String[] args) {
3          float f = 3.14;
4          System.out.println(f);
5      }
6  }
  1. Aコンパイルエラー(3.14 は既定で double であり float への暗黙変換は不可)
  2. Bコンパイル成功・実行して 3.14 と出力される
  3. Cコンパイル成功。byte b = 100; と同様に定数式なので暗黙に float へ変換される
  4. Dコンパイルエラー(float という型自体が非推奨で使用できない)
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

浮動小数点リテラル(fF サフィックスの無いもの)は既定で doubleとして解釈される。

double(64ビット)から float(32ビット)への代入は精度が落ちる縮小変換であり、 intbyte のような「定数式が範囲に収まれば無条件OK」という特例は浮動小数点には適用されない。 そのため 3.14double)をキャストや f サフィックス無しで float 変数へ代入するとコンパイルエラーになる。

正しく書くには float f = 3.14f;f サフィックスでリテラル自体を float にする)か、float f = (float) 3.14;(明示キャスト)のいずれかが必要。

各誤答が違う理由
  • B3.14f サフィックスが無いため double 型のリテラル。float 変数へのキャスト無し代入は縮小変換としてコンパイルエラーになる。
  • Cキャスト無しの縮小変換の特例は整数リテラルにのみ適用され、浮動小数点(double→float)には適用されない。
  • Dfloat は現行のプリミティブ8種の1つとして正式にサポートされている。エラーの原因は型そのものではなく、リテラルとの型不一致。
ひっかけ:byte b = 100; のように、範囲に収まる定数ならキャスト無しで縮小代入できる」というルールを浮動小数点にもそのまま当てはめてしまうのが罠。その特例は整数リテラルの定数式にのみ適用され、浮動小数点リテラル(double→float)には適用されない
コマンド例と想定される挙動(未実行)
javac でコンパイル:
Q14.java:3: error: incompatible types: possible lossy conversion from double to float
        float f = 3.14;
                  ^
→ コンパイル不成立(実行に至らない)。
公式ドキュメント・関連JLS SE11 §3.10.2 Floating-Point Literals
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q14プリミティブ型(char の算術演算と結果の暗黙拡大)難易度 高無料

次のコードのコンパイル結果として正しいものを選べ。

1  public class Q15 {
2      public static void main(String[] args) {
3          char c = 'A';
4          c = c + 1;
5          System.out.println(c);
6      }
7  }
  1. Aコンパイルエラー(c + 1 の結果は int になり char へキャスト無しで代入できない)
  2. Bコンパイル成功・実行して B と出力される
  3. Cコンパイル成功・実行して 66(文字コードの数値)と出力される
  4. Dコンパイルエラー(char 型は算術演算子 + に使用できない)
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

char は文字コードを保持する16ビットの符号無し整数型で、算術演算子(+ など)に使うと int に二項数値昇格(binary numeric promotion)される

c + 1charint の演算であり、結果の型はint になる(値としては 'A' の文字コード65に1を足した66)。

4行目 c = c + 1;int 型の式を char 型の変数へキャスト無しで代入しようとしており、これは縮小変換にあたるためコンパイルエラーになる。 正しく書くには c = (char) (c + 1);(明示キャスト)または c += 1;(複合代入演算子には暗黙のキャストが組み込まれている)を使う。

各誤答が違う理由
  • Bc + 1 の演算結果は int に昇格するため、キャスト無しの代入 c = c + 1; はコンパイルエラーになる。実行までは到達しない。
  • Cそもそもコンパイルが通らない。仮に通ったとしても char 変数の println は文字として出力され、数値としては出力されない。
  • Dchar は数値型として算術演算に使用できる(文字コードとして加減算可能)。エラーの原因は演算自体ではなく、その結果(int)を char へキャスト無しで代入しようとした点。
ひっかけ:char に対する + 1 はそのまま char のままだろう」という思い込みが罠。算術演算の結果は int に昇格するため、単純代入 c = c + 1; はコンパイルエラーになる一方、c += 1; は複合代入演算子が暗黙に (char) キャストを行うためコンパイルが通るという非対称性が試験の定番の狙い目。
コマンド例と想定される挙動(未実行)
javac でコンパイル:
Q15.java:4: error: incompatible types: possible lossy conversion from int to char
        c = c + 1;
              ^
→ コンパイル不成立(実行に至らない)。
公式ドキュメント・関連JLS SE11 §5.6.2 Binary Numeric Promotion
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q15var(ローカル変数型推論の制約)難易度 高無料

var(ローカル変数型推論)に関する次の4つの記述のうち、正しいものをすべて選べ。

A  var は初期化子を省略した宣言(値を代入せずに宣言だけする)には使えない。
B  var はインスタンスフィールドの型としても使用できる。
C  var で宣言した変数の型は初期化式からコンパイル時に確定し、以降に別の型の値を代入することはできない。
D  var x = null; のように null だけを初期化子にして変数を宣言できる。
  1. Avar は初期化子を省略した宣言(値を代入せずに宣言だけする)には使えない。
  2. Bvar はインスタンスフィールドの型としても使用できる。
  3. Cvar で宣言した変数の型は初期化式からコンパイル時に確定し、以降に別の型の値を代入することはできない。
  4. Dvar x = null; のように null だけを初期化子にして変数を宣言できる。
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

var(Java 10〜・ローカル変数型推論)は「型を書かなくてよい」だけであり、あくまで静的型付けの範囲内で使われる点が最大の注意点。

  • A:正しい。var は初期化子から型を推論するため、宣言と同時の初期化が必須var x;(初期化子無し)はコンパイルエラー。
  • B:誤り。var が使えるのはローカル変数(メソッド内・forの初期化子・try-with-resources等)のみ。フィールド・メソッドの引数・戻り値の型には使えない
  • C:正しい。var は動的型付けではない。コンパイル時に初期化式から具体的な型(例:String)が確定し、以降はその型の変数として扱われる(別の型の値を代入すれば通常の型不一致エラーになる)。
  • D:誤り。null 単体からは推論すべき具体的な型が存在しないため、var x = null;コンパイルエラーになる(var x = (String) null; のように明示すれば型が定まり可)。

したがって正しいのは A・C

各誤答が違う理由
  • Bvar はローカル変数専用の機能。インスタンスフィールド・メソッド引数・戻り値の型に使うとコンパイルエラー「var is not allowed here」になる。
  • Dnull 単体からは推論できる具体的な型が存在しないため、var x = null; はコンパイルエラーになる。明示的なキャスト(例:(String) null)があれば可能。
ひっかけ:var は型を書かない=どんな用途にも自由に使える動的型付け」という誤解が最大の罠。実際はローカル変数限定初期化子必須推論後は静的に型固定という3制約があり、B・D はまさにその制約に反する典型例。
コマンド例と想定される挙動(未実行)
A・C:正しい記述(コンパイル時挙動として確認可能)。
B:フィールドに var を使うとコンパイルエラー「var is not allowed here」。
D:var x = null; はコンパイルエラー「cannot infer type for local variable x(variable initializer is 'null')」。
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q16var(配列・拡張for文における型推論)難易度 標準無料

次のコードの出力として正しいものを選べ。

1  public class Q17 {
2      public static void main(String[] args) {
3          var arr = new int[]{1, 2, 3};
4          for (var v : arr) {
5              System.out.print(v + " ");
6          }
7      }
8  }
  1. A1 2 3 (末尾に半角スペース1個)
  2. Bコンパイルエラー(varint[] のような基本型配列には使用できない)
  3. Cコンパイルエラー(拡張for文の変数に var は使用できない)
  4. D123(区切りのスペース無し)
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

var は配列型の変数にも使える。3行目 var arr = new int[]{1, 2, 3}; では、初期化式 new int[]{1, 2, 3} の型が int[] であることから、 arr の型はint[] と推論される。

4行目の拡張for文 for (var v : arr) でも var が使え、arr の要素型 int から v の型はint と推論される。

ループは arr の要素 1, 2, 3 を順に v へ束縛し、System.out.print(v + " ") を3回実行する。 出力は 1 2 3 (各数値の後に半角スペースが1つ付き、末尾にもスペースが1つ残る)。

各誤答が違う理由
  • Bvar はプリミティブの配列型にも使用できる。初期化式 new int[]{1, 2, 3} から int[] として正しく推論されコンパイルは通る。
  • C拡張for文の変数宣言にも var は使用可能。arr の要素型 int から v の型が推論されコンパイルは通る。
  • Dprint(v + " ") は各値の後に半角スペースを明示的に連結して出力している。スペース無しで詰めて出力されるわけではない。
ひっかけ:var は基本型(int等)の配列には使えず参照型限定」という思い込みが罠。var の対象はローカル変数の"型"すべてであり、int[] のようなプリミティブ配列や拡張for文の要素変数にも問題なく使える。
コマンド例と想定される挙動(未実行)
出力:
1 2 3
(末尾に半角スペース1個。改行なし)
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q17ラッパークラス(Integer キャッシュと == の参照比較)難易度 高無料

次のコードの出力として正しいものを選べ。

1  public class Q18 {
2      public static void main(String[] args) {
3          Integer a = 100, b = 100;
4          Integer c = 200, d = 200;
5          System.out.println((a == b) + " " + (c == d));
6      }
7  }
  1. Atrue false
  2. Btrue trueInteger== は常に値を比較する)
  3. Cfalse false(オートボクシングされた Integer は常に新しいオブジェクトになる)
  4. Dコンパイルエラー(Integer 型どうしを == で比較することはできない)
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

Integer a = 100; のような記述はオートボクシングにより内部的に Integer.valueOf(100) が呼ばれる。 Integer.valueOf(int)-128 〜 127 の範囲の値については、あらかじめ用意されたキャッシュ済みインスタンスを使い回す(同じ値なら同一オブジェクトを返す)。

ab100(キャッシュ範囲内)なので、同一のキャッシュ済みオブジェクトを参照する。参照を比較する ==true

cd200(キャッシュ範囲)なので、valueOf は都度新しい Integer オブジェクトを生成する。 値は等しくても参照が異なるため、c == dfalse

出力は "true false"

各誤答が違う理由
  • B== はラッパー型では参照比較。200 はキャッシュ範囲外のため cd は別オブジェクトになり false
  • C-128〜127の範囲は Integer のキャッシュが効き、同じ値なら同一オブジェクトが再利用される。a == b(値100)はキャッシュ範囲内なので true
  • DInteger は参照型であり == による比較自体は文法上合法(意味的には参照比較になるというだけ)。コンパイルエラーにはならない。
ひっかけ:Integer 同士を == で比較すれば値が等しい限り常に true」という思い込みが典型的な罠。==参照比較であり、たまたま-128〜127というキャッシュ範囲内だから true に見えるだけ。値そのものを安全に比較するには常に equals() を使うべき。
コマンド例と想定される挙動(未実行)
出力:
true false
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q18ラッパークラス(オートボクシング/アンボクシングとNullPointerException)難易度 高無料

次のコードと、ラッパークラスの一般的な挙動について、次の4つの記述のうち正しいものをすべて選べ。

1  public class Q19 {
2      public static void main(String[] args) {
3          Integer x = null;
4          int y = x + 1;
5          System.out.println(y);
6      }
7  }
A  4行目 int y = x + 1; の実行時、null であるラッパー参照をアンボクシングしようとして NullPointerException がスローされる。
B  int と Integer の混在した演算(例:int + Integer)では、自動アンボクシングにより Integer 側が int に変換されてから演算される。
C  Integer 同士を == で比較すると、値さえ等しければキャッシュ範囲に関わらず常に true になる。
D  オートボクシング(int → Integer)は、明示的な new Integer(...) 呼び出しと完全に同じ経路(常に新規オブジェクトを生成)で行われる。
  1. A4行目 int y = x + 1; の実行時、null であるラッパー参照をアンボクシングしようとして NullPointerException がスローされる。
  2. BintInteger の混在した演算(例:int + Integer)では、自動アンボクシングにより Integer 側が int に変換されてから演算される。
  3. CInteger 同士を == で比較すると、値さえ等しければキャッシュ範囲に関わらず常に true になる。
  4. Dオートボクシング(int → Integer)は、明示的な new Integer(...) 呼び出しと完全に同じ経路(常に新規オブジェクトを生成)で行われる。
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

  • A:正しい。xnullx + 1 の演算では xintアンボクシングする必要があるが、参照先が無いため NullPointerException が実行時にスローされる(コンパイルエラーではない=コンパイル自体は通る)。
  • B:正しい。intInteger が混在する算術演算では、Integer 側が自動的にアンボクシングされて int 同士の演算になる。
  • C:誤り。== はラッパーオブジェクトの参照を比較する演算子であり、-128〜127のキャッシュ範囲外では別オブジェクトになり false になり得る。「常に true」は誤り。
  • D:誤り。オートボクシングは内部的に Integer.valueOf(int) を呼び出す。valueOfキャッシュ範囲内なら既存オブジェクトを再利用するため、常に新規オブジェクトになるわけではないnew Integer(...) は常に新規生成するが、それとオートボクシングの経路は同じではない)。

したがって正しいのは A・B

各誤答が違う理由
  • C== は参照比較。-128〜127のキャッシュ範囲外では値が同じでも別オブジェクトになり false になり得る。値の比較には equals を使う。「常に true」は誤り。
  • Dオートボクシングは内部で Integer.valueOf(int) を呼び出し、キャッシュ範囲内なら既存オブジェクトを再利用する。常に新規生成する new Integer(...) とは経路も挙動も異なる。
ひっかけ: 「アンボクシングに失敗するのはコンパイルエラーだろう」という誤解、および「オートボクシング= new Integer() と同じ」という誤解の2点が典型的な罠。前者は実行時例外NullPointerException)、後者はvalueOf によるキャッシュ再利用が絡む点で異なる。
コマンド例と想定される挙動(未実行)
実行結果:
Exception in thread "main" java.lang.NullPointerException
    at Q19.main(Q19.java:4)
(4行目のアンボクシングで例外・5行目には到達しない)
公式ドキュメント・関連JLS SE11 §5.1.8 Unboxing Conversion
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q19ラッパークラス(Integer.parseInt vs Integer.valueOf・NumberFormatException)難易度 標準無料

次のコードの実行結果として正しいものを選べ。

1  public class Q20 {
2      public static void main(String[] args) {
3          int a = Integer.parseInt("123");
4          Integer b = Integer.valueOf("123");
5          int c = Integer.parseInt("12.3");
6          System.out.println(a + " " + b);
7      }
8  }
  1. A5行目で NumberFormatException がスローされ、"123 123" は出力されない
  2. B123 123"12.3" は小数点以下を切り捨てて整数変換される)
  3. Cコンパイルエラー(Integer.parseInt("12.3") は文字列の内容次第でコンパイルエラーになる)
  4. D123 123 と正常に出力された後、プログラムがハングする
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

Integer.parseInt(String)Integer.valueOf(String) はどちらも文字列を数値に変換するが、戻り値の型が異なる

  • Integer.parseInt(String):戻り値はプリミティブ int
  • Integer.valueOf(String):戻り値はInteger(ラッパー・オブジェクト)。

3・4行目はどちらも "123"(正しい整数形式)なので問題なく変換される(a=123b=Integer型の123)。

しかし5行目 Integer.parseInt("12.3") は、小数点を含む文字列は整数として解釈できないため、実行時に NumberFormatException がスローされる(これはコンパイル時ではなく、渡された文字列の内容次第で実行時に判明する)。 例外は6行目の println より前に発生するため、"123 123" は出力されない

各誤答が違う理由
  • BInteger.parseInt は小数点を含む文字列を「切り捨てて整数化」するのではなく、そもそも不正な整数形式として例外を投げる。5行目で処理が止まるため6行目には到達しない。
  • C文字列の中身が不正かどうかは実行時にしか判定できない。コンパイラは文字列リテラルの中身を検証しないため、コンパイルは通り、実行時に例外が発生する。
  • D5行目で NumberFormatException が即座にスローされてプログラムは終了する。6行目の println 自体に到達しないため "123 123" は出力されず、ハングもしない。
ひっかけ:"12.3" のような数字っぽい文字列なら parseInt でも通る」という思い込みが罠。parseInt厳密に整数形式(先頭の符号+数字のみ)しか受け付けず、小数点を含む文字列は不正形式として NumberFormatException になる(小数を扱いたい場合は Double.parseDouble を使う)。
コマンド例と想定される挙動(未実行)
実行結果:
Exception in thread "main" java.lang.NumberFormatException: For input string: "12.3"
    at java.base/java.lang.Integer.parseInt(Integer.java:...)
    at Q20.main(Q20.java:5)
(5行目で例外がスローされ、6行目の println には到達しない="123 123" は出力されない)
公式ドキュメント・関連Integer.parseInt(String)(SE11 API)
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q20算術演算子(整数除算の切り捨て)難易度 標準無料

次のコードの出力として正しいものを選べ。

1  public class Q1 {
2      public static void main(String[] args) {
3          int a = 7 / 2;
4          int b = -7 / 2;
5          System.out.println(a + " " + b);
6      }
7  }
  1. A3 -3
  2. B3 -4
  3. C3.5 -3.5
  4. Dコンパイルエラー(負の数を int 変数の除算に使えない)
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

int 同士の除算 /小数点以下を切り捨てる(ゼロ方向へ丸める=truncation)。数学的な「切り下げ(floor)」ではない点に注意する。

  • 7 / 2 = 3.5 → ゼロ方向に切り捨てて 3
  • -7 / 2 = -3.5 → ゼロ方向に切り捨てて -3(floor すると -4 になるがJavaはそうならない)。

したがって a=3, b=-3 となり、出力は 3 -3

各誤答が違う理由
  • B負数の除算を floor(負の無限大方向への切り捨て)だと誤解した答え。Java の整数除算はゼロ方向へ切り捨てるため -7/2-4 ではなく -3
  • Cab はどちらも int 型。int / int の結果は常に int(整数)になり、小数部は保持されない。
  • D負の整数リテラルは通常の int 値であり、除算演算子 / に何ら制約はない。コンパイルは問題なく通る。
ひっかけ: 負の数の除算を「floor(負の無限大方向への切り捨て)」だと誤解しやすい。Java の整数除算は常にゼロへ向かって切り捨てるので、-7 / 2-4 ではなく -3
コマンド例と想定される挙動(未実行)
出力:
3 -3
公式ドキュメント・関連JLS SE11 §15.17 Multiplicative Operators
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q21算術演算子(剰余演算子 % と負数の符号規則)難易度 標準無料

次のコードの出力として正しいものを選べ。

1  public class Q2 {
2      public static void main(String[] args) {
3          int a = -7 % 3;
4          int b = 7 % -3;
5          System.out.println(a + " " + b);
6      }
7  }
  1. A-1 1
  2. B2 -2
  3. C-1 -2
  4. DArithmeticException がスローされる
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

Java の剰余演算子 % の結果の符号は左辺(被除数)の符号と一致する。これは (a / b) * b + (a % b) == a という恒等式から導かれる(/ がゼロ方向への切り捨てであることと整合する)。

  • -7 % 3-7 / 3 はゼロ方向切り捨てで -2-2 * 3 = -6-7 - (-6) = -1-1
  • 7 % -37 / -3 はゼロ方向切り捨てで -2-2 * -3 = 67 - 6 = 11

よって a=-1, b=1、出力は -1 1

各誤答が違う理由
  • B剰余の符号を除数(右辺)に合わせて考えた誤り。Java の % の符号は被除数(左辺)の符号に従う。
  • C7 % -3 の符号を左辺 7(正)に合わせず右辺の符号に引っ張られた誤り。正しくは被除数が正なので結果も正の 1
  • D% が例外を投げるのは除数が0のときだけ。ここでの除数は 3-3 でありゼロ除算ではない。
ひっかけ: 「剰余の符号は除数(右辺)に従う」という誤解が多い。実際は被除数(左辺)の符号に従う-7 % 3 が正の 2 になる、というのは誤り。
コマンド例と想定される挙動(未実行)
出力:
-1 1
公式ドキュメント・関連JLS SE11 §15.17.3 Remainder Operator %
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q22インクリメント/デクリメント演算子(前置・後置の評価順)難易度 高無料

次のコードの出力として正しいものを選べ。

1  public class Q3 {
2      public static void main(String[] args) {
3          int i = 5;
4          int j = i++ + ++i;
5          System.out.println(i + " " + j);
6      }
7  }
  1. A7 12
  2. B7 13
  3. C6 12
  4. D7 11
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

後置 i++ は「現在の値を式の値として使い、その後に i を1増やす」。前置 ++i は「先に i を1増やし、増やした後の値を式の値として使う」。この違いを左から順に追う。

  • i++:式の値は増やす前の i5。副作用として i6 になる。
  • ++i:まず i7 に増やし、式の値も7

j = 5 + 7 = 12。最終的な i7。よって出力は 7 12

各誤答が違う理由
  • Bi++ の式の値を増加後の6と誤解した計算(6+7=13)。後置演算子の式の値は増やす前の値(5)である。
  • C最終的な i の値を取り違えた誤り。i++++i の副作用で i は5→6→7と2回増える。最終値は7。
  • D++i の式の値を増加前の6のまま使ったと仮定した誤り。前置演算子は増やした後の値(7)を返す。
ひっかけ:i++ + ++i は同じ i を2回参照するから i×2 のように単純に計算できる」と考えて i=6 のまま両方に6を使ってしまう(6+6=12 は偶然近い値になるが根拠が誤り)のが典型。各演算子がいつ値を確定させ、いつ副作用を起こすかを左から順に追う必要がある。
コマンド例と想定される挙動(未実行)
出力:
7 12
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q23代入演算子(複合代入演算子の暗黙の縮小変換)難易度 標準無料

次のコードの出力として正しいものを選べ。

1  public class Q4 {
2      public static void main(String[] args) {
3          byte b = 10;
4          b += 5;
5          System.out.println(b);
6      }
7  }
  1. A15
  2. Bコンパイルエラー(int の結果を byte 変数に複合代入できない)
  3. CClassCastException が実行時にスローされる
  4. D5+= は上書き代入として働く)
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

複合代入演算子 E1 op= E2 は、単なる E1 = E1 op E2 の省略形ではなく、結果を E1 の型へ自動的にキャストし直すという特別な意味を持つ(JLS §15.26.2)。等価な形は次の通り:

E1 = (T) ((E1) op (E2))

ここで TE1byte b)の型。b + 5 は二項数値昇格により int 演算(15)になるが、b += 5 はこれを暗黙に (byte) へキャストしてから b へ代入する。15byte の範囲(-128〜127)に収まるため実行時エラーにもならず、b15 になる。

各誤答が違う理由
  • B複合代入演算子は結果を左辺の型へ暗黙にキャストする特別な意味を持つため、byte += int はコンパイルエラーにならない。エラーになるのは b = b + 5;(単純代入)の場合。
  • C複合代入の暗黙キャストはコンパイル時に組み込まれる縮小変換であり、実行時に例外を投げるものではない(値が範囲外でも例外にはならず単に切り詰められる)。
  • D+= は「加算してから代入」であり単なる上書きではない。b の元の値10に5を加えた15になる。
ひっかけ: もし b = b + 5;(複合代入ではなく単純代入+加算)と書くと、右辺 b + 5int 型になり、コンパイルエラーになる(int から byte への暗黙の縮小変換は変数同士の式では許されない)。+= のような複合代入演算子だけが自動キャストという特別扱いを受ける点が Silver 頻出の引っかけ。
コマンド例と想定される挙動(未実行)
出力:
15
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q24算術演算子(+ の左結合評価順と文字列連結演算子の切り替わり)難易度 標準無料

次のコードの出力として正しいものを選べ。

1  public class Q5 {
2      public static void main(String[] args) {
3          System.out.println(1 + 2 + "3" + 4 + 5);
4      }
5  }
  1. A3345
  2. B12345
  3. C1+2+34+5 のような文字列がそのまま出力される(数値部分も文字として結合)
  4. Dコンパイルエラー(intString+ で混在できない)
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

+ 演算子は左から右へ結合(left-associative)し、途中で数値の加算文字列連結が切り替わる点が重要。String が一度でも登場すると、それ以降の +すべて文字列連結になる。

  • 1 + 2:どちらも int → 加算 → 3(int)。
  • 3 + "3":右辺が String → 文字列連結 → "33"
  • "33" + 4:左辺が既に String → 文字列連結 → "334"
  • "334" + 5:同様に連結 → "3345"

出力は 3345

各誤答が違う理由
  • B"3" が登場した時点で右側の + は文字列連結に切り替わる、という点を無視した誤り。全体が数値加算のまま進むことはない("3"String リテラル)。
  • C1 + 2String が登場するに評価されるので、まず数値として計算され 3 になる。式の記号がそのまま文字列化されることはない。
  • D+ 演算子は String と数値(あるいは他の任意の値)の連結を正式にサポートする(文字列連結演算子)。混在自体はエラーではない。
ひっかけ:+ が1つでも文字列を含む式に登場すると、式全体がすべて文字列連結になる」という誤解が多い。実際は左から評価が進み、String が現れた時点から右側だけが文字列連結に切り替わる1+2 の部分は先に数値として計算されるため、"1234"+5"123"+"4"+"5" にはならない。
コマンド例と想定される挙動(未実行)
出力:
3345
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q25論理演算子(&& の短絡評価と副作用の有無)難易度 高無料

次のコードの出力として正しいものを選べ。

1  public class Q6 {
2      static boolean check(int x, StringBuilder sb) {
3          sb.append(x);
4          return x > 0;
5      }
6      public static void main(String[] args) {
7          StringBuilder sb = new StringBuilder();
8          boolean r = check(-1, sb) && check(2, sb);
9          System.out.println(r + " " + sb);
10     }
11 }
  1. Afalse -1
  2. Bfalse -12
  3. Ctrue -12
  4. DNullPointerException がスローされる
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

&&(条件積・短絡評価)は、左辺が false であればその時点で式全体が false と確定し、右辺は評価されない(呼び出されない)

  • check(-1, sb) が実行される:sb"-1" が追加され、-1 > 0false を返す。
  • 左辺が false なので && は短絡し、check(2, sb) は呼ばれないsb"2" は追加されない)。
  • r = falsesb の内容は "-1" のまま。

出力は false -1

各誤答が違う理由
  • B&& は左辺が false の時点で短絡し、右辺 check(2, sb)呼ばれない。よって sb"2" は追加されない。
  • Ccheck(-1, sb)-1 > 0false を返すため、rfalse になる(true にはならない)。
  • Dsbnew StringBuilder() で初期化済みの非 null オブジェクト。append 呼び出しに問題はなく例外は発生しない。
ひっかけ:&& の両辺は必ず両方評価される」という誤解が典型。実際には左辺が false の時点で右辺の副作用(メソッド呼び出し・sb.append など)は一切発生しない。両辺を必ず評価したい場合は非短絡の & を使う必要がある。
コマンド例と想定される挙動(未実行)
出力:
false -1
公式ドキュメント・関連JLS SE11 §15.23 Conditional-And Operator &&
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q26論理演算子(& と | の boolean 型への適用・非短絡評価)難易度 高無料

論理演算子 &&||(条件積・条件和)と &|(ビット単位/論理演算子)に関する次の記述のうち、正しいものをすべて選べ(複数選択)

  1. A&& は左辺が false であれば右辺を評価しない(短絡評価)。
  2. B&boolean 型同士にも使え、その場合は両辺を必ず評価する(短絡評価しない)。
  3. C|int 型のビット演算にのみ使え、boolean 型には使えない。
  4. D|| は左辺が true であれば右辺を評価しない(短絡評価)。
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

&| は「int 同士のビット演算子」というイメージが強いが、実はboolean 同士にも適用でき、その場合は「短絡評価をしない論理演算子」として働く(JLS §15.22)。

  • &&:左辺が false なら右辺を評価しない(短絡評価)。
  • ||:左辺が true なら右辺を評価しない(短絡評価)。
  • &(boolean版):両辺を必ず評価してから論理積を取る(短絡しない)。
  • |(boolean版):両辺を必ず評価してから論理和を取る(短絡しない)。

したがって &int のビット演算専用ではなく boolean にも使え、| も同様に boolean に使える。「|int のビット演算にしか使えない」という記述は誤り。

各誤答が違う理由
  • C|boolean 型同士にも適用でき、その場合は「短絡しない論理和」として動作する。int 専用というのは誤り。
ひっかけ: Silver 頻出の誤解は「&| は数値のビット演算専用で boolean には使えない」というもの。実際は両方の型で使える多重定義された演算子であり、boolean に対しては「短絡しない論理演算子」として動作する。副作用(メソッド呼び出し・変数の変更)を両辺で必ず起こしたい場合にあえて &| を使うテクニックがある。
コマンド例と想定される挙動(未実行)
検証(例):
static boolean check(int x, StringBuilder sb){ sb.append(x); return x>0; }
StringBuilder sb = new StringBuilder();
boolean r = check(1, sb) | check(-2, sb);
// r=true、sb="1-2" (両辺とも呼ばれる=非短絡)
公式ドキュメント・関連JLS SE11 §15.22 Bitwise and Logical Operators
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q27条件演算子(三項演算子 ?: の二項数値昇格)難易度 高無料

次のコードの出力として正しいものを選べ。

1  public class Q8 {
2      public static void main(String[] args) {
3          int x = 5;
4          System.out.println(true ? x : 3.0);
5      }
6  }
  1. A5.0
  2. B5
  3. Cコンパイルエラー(?: の第2・第3オペランドの型が異なる)
  4. D3.0
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

条件演算子 ? :結果の型は、条件が実際に truefalse のどちらであったかとは無関係に、第2・第3オペランドの型から静的に決まる(JLS §15.25)。

第2オペランドが intx)、第3オペランドが double3.0)で、両者が数値型かつ定数の特別扱い(byteへの収まり等)に該当しない場合、二項数値昇格(binary numeric promotion)が適用され、式全体の型はより広い double に統一される。

したがって、条件が true で選ばれるのは x の枝でも、評価結果は int5 のままではなく、double に昇格された 5.0 になる。println(double)5.0 と表示する。

各誤答が違う理由
  • B条件が truex 側が選ばれても、式全体の型は第2・第3オペランドの型(intdouble)から静的に決まり、double に統一される。よって 5 ではなく 5.0
  • Cintdouble はともに数値型で二項数値昇格の対象になるため、型が異なっていてもコンパイルは通る(結果型は double)。
  • D条件は true なので選ばれるのは x 側の枝であり、3.0(選ばれなかった枝の値)が出力されることはない。
ひっかけ: 「条件が true なら xint)がそのまま返る」と考えて 5 だと誤答しやすい。実際は選ばれなかった枝の型も含めて式全体の型が決まるため、intdouble が混在すると選ばれた枝の値も double に昇格される。これは Silver 試験の頻出の落とし穴。
コマンド例と想定される挙動(未実行)
出力:
5.0
公式ドキュメント・関連JLS SE11 §15.25 Conditional Operator ? :
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q28演算子の優先順位(算術 → 関係 → 論理の順で評価される)難易度 標準無料

次のコードの出力として正しいものを選べ。

1  public class Q9 {
2      public static void main(String[] args) {
3          System.out.println(10 + 5 * 2 > 15 && 3 < 4);
4      }
5  }
  1. Atrue
  2. Bfalse
  3. Cコンパイルエラー(算術演算子と関係演算子・論理演算子を1つの式に混在できない)
  4. D30
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

Java の演算子優先順位は概ね 乗除算(*/%) > 加減算(+-) > 関係演算子(<> 等) > 論理演算子(&&||の順(数値が大きいものから低くなる)。この順で式を分解する。

  • 乗算:5 * 2 = 10
  • 加算:10 + 10 = 20
  • 関係演算子:20 > 15true3 < 4true
  • 論理積:true && truetrue

出力は true

各誤答が違う理由
  • B優先順位通りに計算すると 10+5*2=2020>15true3<4true で論理積は truefalse になる根拠がない。
  • CJava では優先順位に従って算術・関係・論理演算子を1つの式に自由に混在できる。これは合法な式でコンパイルは通る。
  • D+* より先に計算した誤り((10+5)*2=30)。乗算 * は加算 + より優先順位が高いため、先に 5*2=10 を計算する。
ひっかけ: 優先順位を誤って左から単純に演算すると (10+5)=1515*2=30 のように順序を取り違え、比較の対象がズレる。乗除算は加減算より先算術演算子は関係演算子より先関係演算子は論理演算子より先という3段階の優先度を意識する。
コマンド例と想定される挙動(未実行)
出力:
true
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q29代入演算子(単純代入・複合代入・final再代入のコンパイル可否)難易度 標準無料

次の4つの独立したコードスニペットのうち、コンパイルが通るものをすべて選べ(複数選択)

  1. Aint x = 10; x += 3.5; System.out.println(x);
  2. Bint x = 10; x = x + 3.5; System.out.println(x);
  3. Cbyte b = 10; b++; System.out.println(b);
  4. Dfinal int y = 5; y = 6; System.out.println(y);
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

代入演算子まわりのコンパイル可否は「暗黙の縮小変換が許される場面か」と「final 変数への再代入か」で決まる。

  • A:x += 3.5; は複合代入演算子。x = (int)(x + 3.5) と等価に暗黙キャストされるためコンパイルが通るx(int)13.5 = 13)。
  • B:x = x + 3.5; は単純代入。右辺 x + 3.5double になり、それを int 変数へ明示キャスト無しで代入しようとするためコンパイルエラーdoubleint の暗黙の縮小変換は不可)。
  • C:b++; は増分演算子。複合代入と同様に暗黙キャストが働くため byte に対してもコンパイルが通る
  • D:final 変数への再代入はコンパイルエラーfinal は「一度だけ代入可・以後変更不可」を意味する)。

コンパイルが通るのは A と C

各誤答が違う理由
  • B単純代入 = には複合代入のような暗黙キャストが働かない。x + 3.5double であり、明示キャスト無しで int 変数へは代入できずコンパイルエラーになる。
  • Dfinal 修飾された変数は一度初期化されると再代入できない。y = 6; の時点でコンパイルエラーになる。
ひっかけ: 複合代入演算子(+= 等)や増分・減分演算子(++--)は暗黙の縮小キャストという特別扱いを受けるが、単純代入(=)にはその特別扱いが無い、という非対称性が最大の引っかけ。
コマンド例と想定される挙動(未実行)
検証:
A) int x=10; x+=3.5; → コンパイル可・x=13
B) int x=10; x=x+3.5; → コンパイルエラー(incompatible types: possible lossy conversion from double to int)
C) byte b=10; b++;   → コンパイル可・b=11
D) final int y=5; y=6; → コンパイルエラー(cannot assign a value to final variable y)
公式ドキュメント・関連JLS SE11 §15.26 Assignment Operators
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
Q30インクリメント演算子(配列要素への代入における評価順)難易度 高無料

次のコードの出力として正しいものを選べ。

1  public class Q11 {
2      public static void main(String[] args) {
3          int[] arr = {10, 20, 30};
4          int i = 0;
5          arr[i++] = i;
6          System.out.println(arr[0] + " " + arr[1] + " " + i);
7      }
8  }
  1. A1 20 1
  2. B0 20 1
  3. C1 20 0
  4. DArrayIndexOutOfBoundsException がスローされる
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

配列要素への代入 arr[E2] = E3; の評価順は JLS で厳密に決まっている(§15.26.1)。

  1. まず配列参照 arr を評価する。
  2. 次に添字(インデックス)式 i++ を評価する。ここで後置インクリメントの副作用(i を1増やす)がこの時点で発生する。式の値としては増やす前の 0 が使われるので、代入先は arr[0]。同時に i1 になる。
  3. 最後に右辺 i を評価する。この時点で i は既に 1 に更新済みなので、右辺の値は 1
  4. arr[0] = 1; が実行される。

結果:arr = {1, 20, 30}i = 1。出力は 1 20 1

各誤答が違う理由
  • B右辺の i は、添字式 i++ の副作用で既に1へ更新されたに評価される。よって代入される値は0ではなく1。
  • Ci++ は必ず i を1増やす副作用を伴う。実行後の i が0のまま残ることはなく、最終的に1になる。
  • D添字として使われるのは i++ の値(増やす前の0)であり、arr(要素数3)の有効範囲内。範囲外アクセスは発生しない。
ひっかけ: 「左辺の添字を先に決めてから右辺を評価する」という代入の評価順(左→右)を知らないと、右辺の iまだ増える前の 0 だと誤解し arr[0]=0 になると考えがち。実際は添字式の副作用(インクリメント)は右辺の評価より先に確定するため、右辺の i はすでに更新後の値 1 を見る。
コマンド例と想定される挙動(未実行)
出力:
1 20 1
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)

無料サンプルはここまでです。全問に挑戦するには6ヶ月アクセスパス(1回払い・自動更新なし)をご利用ください。ログインすると、間違えた問題だけを集めて復習できます。

料金プランを見る