【Java Gold】コード読解問題20選|出力結果・コンパイルエラーを完全解説」【SE17対応】

【図解】Java Gold SE17対応のコード読解問題20選。プログラムの出力結果やコンパイルエラーの判断ポイント、API理解などの学習ステップを、猫と人間のキャラクターとともに手書き風イラストで完全解説したアイキャッチ画像。

Java Gold試験で避けて通れないのがコード読解問題です。「このコードを実行すると何が出力されるか」「コンパイルエラーになるか」という問題は、知識だけでなくコードを正確に読む力が問われます。この記事ではJava Gold頻出パターンをカバーしたオリジナル問題20問を、解説付きで徹底解説します。

目次

Java Goldコード読解問題の傾向と対策

Java Goldのコード読解問題は大きく3パターンに分かれます。

  • 出力結果を答える問題:実行したときに何が表示されるかを選ぶ
  • コンパイルエラー・実行時エラーを判定する問題:エラーになるかどうか、なるとしたらどこかを選ぶ
  • 例外がスローされるかを判定する問題:どの例外がどのタイミングでスローされるかを選ぶ

いずれも「なんとなく読む」ではなく「1行ずつ追う」習慣が正解への最短ルートです。では問題に入ります。

【第1問〜第5問】継承とポリモーフィズム

第1問:メソッドのオーバーライド

class Animal {
    String sound() { return "..."; }
}
class Dog extends Animal {
    String sound() { return "ワン"; }
}
public class Main {
    public static void main(String[] args) {
        Animal a = new Dog();
        System.out.println(a.sound());
    }
}

このコードを実行したとき、出力される結果はどれですか?

A. ...  B. ワン  C. コンパイルエラー  D. 実行時エラー

解説を見る

正解:B「ワン」

変数の型はAnimalですが、実際のオブジェクトはDogです。Javaのポリモーフィズムでは実際のオブジェクトの型のメソッドが呼ばれます(動的ディスパッチ)。参照型がAnimalでも、実行時にはDogのsound()が呼ばれるため「ワン」が出力されます。

第2問:コンストラクタの呼び出し順序

class Parent {
    Parent() { System.out.println("Parent"); }
}
class Child extends Parent {
    Child() { System.out.println("Child"); }
}
public class Main {
    public static void main(String[] args) {
        new Child();
    }
}

このコードを実行したとき、出力される結果はどれですか?

A. Childのみ  B. Parentのみ  C. ParentChildの順  D. ChildParentの順

解説を見る

正解:C「Parent」→「Child」の順

サブクラスのコンストラクタが呼ばれると、最初にスーパークラスのコンストラクタが暗黙的に呼ばれます(super()の暗黙呼び出し)。そのためParentのコンストラクタが先に実行され「Parent」が出力され、続いて「Child」が出力されます。

第3問:インターフェースのdefaultメソッド

interface Greeter {
    default String greet() { return "Hello"; }
}
class JapaneseGreeter implements Greeter {
    public String greet() { return "こんにちは"; }
}
public class Main {
    public static void main(String[] args) {
        Greeter g = new JapaneseGreeter();
        System.out.println(g.greet());
    }
}

このコードを実行したとき、出力される結果はどれですか?

A. Hello  B. こんにちは  C. Helloこんにちは両方  D. コンパイルエラー

解説を見る

正解:B「こんにちは」

インターフェースのdefaultメソッドは、実装クラスでオーバーライドされた場合は実装クラスのメソッドが優先されます。JapaneseGreeterがgreet()をオーバーライドしているため「こんにちは」が出力されます。

第4問:抽象クラスとインスタンス化

abstract class Shape {
    abstract double area();
    void describe() { System.out.println("面積: " + area()); }
}
class Circle extends Shape {
    double radius;
    Circle(double r) { this.radius = r; }
    double area() { return Math.PI * radius * radius; }
}
public class Main {
    public static void main(String[] args) {
        Shape s = new Circle(1.0);
        s.describe();
    }
}

このコードの実行結果として正しいものはどれですか?

A. コンパイルエラー  B. 実行時エラー  C. 面積: 3.141592653589793が出力される  D. 面積: 0.0が出力される

解説を見る

正解:C「面積: 3.141592653589793」

抽象クラス自体はインスタンス化できませんが、サブクラスはインスタンス化できます。describe()の中でarea()を呼ぶと、動的ディスパッチによりCircleのarea()が呼ばれます。Math.PI * 1.0 * 1.0の結果が出力されます。

第5問:キャストと ClassCastException

class Animal {}
class Dog extends Animal {}
class Cat extends Animal {}
public class Main {
    public static void main(String[] args) {
        Animal a = new Dog();
        Cat c = (Cat) a;
        System.out.println("完了");
    }
}

このコードの実行結果として正しいものはどれですか?

A. 完了が出力される  B. コンパイルエラー  C. ClassCastExceptionがスローされる  D. NullPointerExceptionがスローされる

解説を見る

正解:C「ClassCastException」

コンパイル時はAnimal型からCat型へのキャストとして文法的には問題ないためコンパイルエラーにはなりません。しかし実行時に実際のオブジェクトはDogであり、CatはDogのスーパークラスでも実装インターフェースでもないためClassCastExceptionがスローされます。instanceofで確認してからキャストする習慣が重要です。

【第6問〜第10問】ラムダ式とStream API

第6問:ラムダ式の基本

import java.util.function.Function;
public class Main {
    public static void main(String[] args) {
        Function<Integer, Integer> doubler = x -> x * 2;
        System.out.println(doubler.apply(5));
    }
}

このコードを実行したとき、出力される結果はどれですか?

A. 5  B. 10  C. 25  D. コンパイルエラー

解説を見る

正解:B「10」

Function<T, R>は引数Tを受け取り結果Rを返す関数型インターフェースです。x -> x * 2は引数xを受け取りx*2を返すラムダ式。apply(5)で5を渡すと5*2=10が返されます。

第7問:Stream APIのfilterとcollect

import java.util.*;
import java.util.stream.*;
public class Main {
    public static void main(String[] args) {
        List<Integer> nums = Arrays.asList(1, 2, 3, 4, 5);
        List<Integer> result = nums.stream()
            .filter(n -> n % 2 == 0)
            .collect(Collectors.toList());
        System.out.println(result);
    }
}

このコードを実行したとき、出力される結果はどれですか?

A. [1, 3, 5]  B. [2, 4]  C. [1, 2, 3, 4, 5]  D. コンパイルエラー

解説を見る

正解:B「[2, 4]」

filter()は条件に一致する要素だけを通す中間操作です。n % 2 == 0は偶数の条件なので、1〜5の中から2と4だけが残ります。collect(Collectors.toList())で結果をListにまとめます。

第8問:mapとreduce

import java.util.*;
import java.util.stream.*;
public class Main {
    public static void main(String[] args) {
        List<Integer> nums = Arrays.asList(1, 2, 3, 4, 5);
        int sum = nums.stream()
            .map(n -> n * 2)
            .reduce(0, Integer::sum);
        System.out.println(sum);
    }
}

このコードを実行したとき、出力される結果はどれですか?

A. 15  B. 25  C. 30  D. 0

解説を見る

正解:C「30」

まずmap(n -> n * 2)で各要素を2倍にすると[2, 4, 6, 8, 10]になります。次にreduce(0, Integer::sum)で初期値0から全要素を加算すると2+4+6+8+10=30になります。

第9問:Optional

import java.util.Optional;
public class Main {
    public static void main(String[] args) {
        Optional<String> opt = Optional.empty();
        System.out.println(opt.orElse("デフォルト"));
    }
}

このコードを実行したとき、出力される結果はどれですか?

A. null  B. 空文字  C. デフォルト  D. NoSuchElementExceptionがスローされる

解説を見る

正解:C「デフォルト」

Optional.empty()は空のOptionalを生成します。orElse()は値が存在しない場合に引数の値を返します。値が存在する場合はその値を、空の場合は引数の値を返すため「デフォルト」が出力されます。get()を使うとNoSuchElementExceptionがスローされる点も覚えておきましょう。

第10問:Stream APIの遅延評価

import java.util.*;
import java.util.stream.*;
public class Main {
    public static void main(String[] args) {
        long count = Arrays.asList(1, 2, 3, 4, 5)
            .stream()
            .filter(n -> {
                System.out.println("filter: " + n);
                return n % 2 == 0;
            })
            .count();
        System.out.println("count: " + count);
    }
}

このコードで「filter:」は何回出力されますか?

A. 0回  B. 2回  C. 5回  D. count()が呼ばれるまで出力されない

解説を見る

正解:C「5回」

Streamの中間操作(filter等)は終端操作(count等)が呼ばれるまで実行されません(遅延評価)。count()が呼ばれた時点でfilterが実行され、1〜5の全要素に対してfilterが適用されるため「filter:」は5回出力されます。その後「count: 2」が出力されます。

【第11問〜第15問】例外処理

第11問:try-catch-finally

public class Main {
    public static void main(String[] args) {
        try {
            System.out.println("try");
            throw new RuntimeException();
        } catch (RuntimeException e) {
            System.out.println("catch");
        } finally {
            System.out.println("finally");
        }
    }
}

このコードを実行したとき、出力される結果はどれですか?

A. tryのみ  B. try→catch  C. try→catch→finally  D. try→finally

解説を見る

正解:C「try→catch→finally」

finally ブロックは例外がキャッチされてもされなくても必ず実行されます。tryでRuntimeExceptionがスローされ、catchで捕捉、最後にfinallyが実行されます。

第12問:try-with-resources

public class Main {
    static class MyResource implements AutoCloseable {
        public void close() { System.out.println("close"); }
    }
    public static void main(String[] args) {
        try (MyResource r = new MyResource()) {
            System.out.println("use");
        }
        System.out.println("end");
    }
}

このコードを実行したとき、出力される結果はどれですか?

A. use→end  B. use→close→end  C. close→use→end  D. コンパイルエラー

解説を見る

正解:B「use→close→end」

try-with-resourcesではtryブロックを抜けると自動的にclose()が呼ばれます。AutoCloseableを実装しているクラスがこの構文で使えます。tryブロック内の処理→close()→tryの後の処理、という順で実行されます。

第13問:例外の継承関係

public class Main {
    public static void main(String[] args) {
        try {
            throw new IllegalArgumentException("test");
        } catch (RuntimeException e) {
            System.out.println("RuntimeException: " + e.getMessage());
        } catch (IllegalArgumentException e) {
            System.out.println("IllegalArgumentException: " + e.getMessage());
        }
    }
}

このコードの実行結果として正しいものはどれですか?

A. RuntimeException: test  B. IllegalArgumentException: test  C. コンパイルエラー  D. 両方のcatchブロックが実行される

解説を見る

正解:C「コンパイルエラー」

IllegalArgumentExceptionはRuntimeExceptionのサブクラスです。catch節はより具体的な例外を先に書かなければなりません。スーパークラスのRuntimeExceptionを先に書くと、後のIllegalArgumentExceptionのcatchが到達不能コードになるためコンパイルエラーになります。

第14問:チェック例外と非チェック例外

public class Main {
    static void method() throws Exception {
        throw new Exception("チェック例外");
    }
    public static void main(String[] args) {
        method();
    }
}

このコードの実行結果として正しいものはどれですか?

A. 正常に実行される  B. 実行時にExceptionがスローされる  C. コンパイルエラー  D. NullPointerExceptionがスローされる

解説を見る

正解:C「コンパイルエラー」

Exceptionはチェック例外です。チェック例外をスローするメソッドを呼び出す側は、try-catchで捕捉するか、throws宣言で上位に伝播させる必要があります。main()でtry-catchもthrowsもしていないためコンパイルエラーになります。

第15問:finally内のreturn

public class Main {
    static int method() {
        try {
            return 1;
        } finally {
            return 2;
        }
    }
    public static void main(String[] args) {
        System.out.println(method());
    }
}

このコードを実行したとき、出力される結果はどれですか?

A. 1  B. 2  C. 12両方  D. コンパイルエラー

解説を見る

正解:B「2」

tryブロックでreturn 1が実行されますが、finallyブロックはreturnの前にも実行されます。finallyでreturn 2が実行されると、tryのreturn 1は上書きされ、最終的に2が返されます。finallyでreturnを書くのは混乱のもとなので実務では避けるべきパターンです。

【第16問〜第20問】その他の頻出パターン

第16問:staticメソッドとインスタンスメソッド

class Counter {
    static int count = 0;
    Counter() { count++; }
    static int getCount() { return count; }
}
public class Main {
    public static void main(String[] args) {
        new Counter();
        new Counter();
        new Counter();
        System.out.println(Counter.getCount());
    }
}

このコードを実行したとき、出力される結果はどれですか?

A. 0  B. 1  C. 3  D. コンパイルエラー

解説を見る

正解:C「3」

staticフィールドはクラス全体で共有されるため、インスタンスを生成するたびにcountがインクリメントされます。3回newしているのでcount=3になります。staticメソッドはクラス名.メソッド名で呼び出せます。

第17問:String の比較

public class Main {
    public static void main(String[] args) {
        String a = new String("hello");
        String b = new String("hello");
        System.out.println(a == b);
        System.out.println(a.equals(b));
    }
}

このコードを実行したとき、出力される結果はどれですか?

A. true→true  B. false→false  C. true→false  D. false→true

解説を見る

正解:D「false→true」

==は参照の比較です。new String()で生成した場合は別々のオブジェクトが生成されるため参照が異なりfalseになります。equals()は内容の比較なので「hello」と「hello」は等しくtrueになります。Stringの比較には必ずequals()を使いましょう。

第18問:var(型推論)

public class Main {
    public static void main(String[] args) {
        var list = new java.util.ArrayList<String>();
        list.add("Java");
        list.add("Gold");
        var text = String.join("-", list);
        System.out.println(text);
    }
}

このコードを実行したとき、出力される結果はどれですか?

A. JavaGold  B. Java-Gold  C. [Java, Gold]  D. コンパイルエラー

解説を見る

正解:B「Java-Gold」

varはローカル変数の型推論で、コンパイル時に型が決定されます。String.join(区切り文字, Iterable)は要素を区切り文字で連結したStringを返します。「-」で「Java」と「Gold」を連結すると「Java-Gold」になります。

第19問:レコードクラス

public class Main {
    record Point(int x, int y) {}
    public static void main(String[] args) {
        Point p1 = new Point(1, 2);
        Point p2 = new Point(1, 2);
        System.out.println(p1.equals(p2));
        System.out.println(p1.x());
    }
}

このコードを実行したとき、出力される結果はどれですか?

A. false→1  B. true→1  C. true→x  D. コンパイルエラー

解説を見る

正解:B「true→1」

レコードクラスはequals()・hashCode()・toString()が自動生成されます。equals()は全コンポーネントの値が等しければtrueを返すため、p1とp2は同じ値なのでtrue。アクセサメソッドはフィールド名と同じ名前で自動生成されるため、p1.x()で1が返されます。

第20問:Sealed Class

public class Main {
    sealed interface Shape permits Circle, Rectangle {}
    record Circle(double radius) implements Shape {}
    record Rectangle(double width, double height) implements Shape {}
    
    static double area(Shape s) {
        return switch (s) {
            case Circle c -> Math.PI * c.radius() * c.radius();
            case Rectangle r -> r.width() * r.height();
        };
    }
    public static void main(String[] args) {
        System.out.println(area(new Rectangle(3.0, 4.0)));
    }
}

このコードを実行したとき、出力される結果はどれですか?

A. 7.0  B. 12.0  C. コンパイルエラー  D. 実行時エラー

解説を見る

正解:B「12.0」

Sealed Classはpermitsで許可するサブクラスを限定します。Switch式のパターンマッチングでShapeの全サブタイプを網羅しているためdefaultなしでコンパイルできます。Rectangle(3.0, 4.0)のareaはwidth*height=3.0*4.0=12.0になります。

まとめ:コード読解問題で点数を上げる3つのコツ

  1. 1行ずつ実行順を追う:「なんとなく読む」ではなく、変数の値を手元でメモしながら追う習慣をつける
  2. エラーの種類を区別する:「コンパイルエラー」「実行時エラー」「例外」の3つは別物。どの段階で何が起きるかを整理する
  3. 頻出パターンを体で覚える:ポリモーフィズム・ラムダ・例外処理・String比較は繰り返し出る。このページの問題を3周すると感覚がつかめる

Java Goldの試験範囲全体についてはOracle公式:Java SE 17 Developer 認定資格(公式)も確認してください。

セキュアコーディングの問題対策はこちら。→Javaアプリケーションにおけるセキュアコーディング完全攻略

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

tibiyaのアバター tibiya ITエンジニア

文系卒あほエンジニア
趣味はゲームとギャンブルとテニスっぽいスポーツと釣りです
Java javascript angular react C#

コメント

コメントする

目次