プログラミング言語を整える
中級Java Silver を整える。
= Java Silver(SE 17)の試験範囲を、章ごとの練習問題で確かめる
Java Silver が初めての方は、先に そもそも Java Silver とは・どんな場面で役立つか をどうぞ。
入門の資格は Java Bronze を整える にあります。
試験の概要
- 試験名
- Java SE 17 Programmer I
- 試験番号
- 1Z0-825-JPN
- 資格
- Oracle Certified Java Programmer, Silver SE 17
- 形式
- 選択問題
- 時間
- 90分
- 問題数
- 60問
- 合格ライン
- 65%
- 配信
- 2027年2月28日に配信終了。SE 25 対応の試験は2026年11月下旬から配信予定(試験番号・範囲は未発表)
出典:Oracle の公式ページ(2026年11月3日時点)。試験の条件や日程は変わることがあるので、申し込む前に公式ページで最新の情報を確かめてください。
いつ・どれを受ける?
受験予定日から、受けられる試験を引く
Java の日本語試験は、バージョンごとに配信の終わる日が決まっています。受験予定日を入れると、その日に受けられるものが出ます。
配信が終わっても、取得済みの資格がすぐに失効するわけではありません。
配信が終わる日の一覧(日付を入れなくても見られます)
- Bronze(1Z0-818-JPN):配信は続きます。
- Silver SE 11(1Z0-815-JPN):2026年11月30日に配信終了。
- Silver SE 17(1Z0-825-JPN):2027年2月28日に配信終了。
- Silver SE 25 対応:2026年11月下旬から配信予定。試験番号と範囲は未発表です。
Java 資格の試験の切り替わり(NOBORIBA®研修サービスのお知らせ)に、版の切り替わりの詳しい案内があります。
試験範囲マップ
6つの章ごとに、覚えることと練習問題への入口を並べました。範囲の言葉は Oracle の試験内容チェックリストに沿っています。
SE 17 で加わった の印は、SE 11 の試験にはなく、SE 17 の試験で加わった範囲です。
SE 25 対応の試験の範囲は、試験の開始時に Oracle から発表される予定です。発表され次第、このページを更新します。このページの範囲と練習問題は SE 17 の試験のものです。
- 1
Java の概要と簡単なJavaプログラムの作成
- ・mainメソッドを持つ実行可能なJavaプログラムの作成
- ・コマンドラインでのJavaプログラムのコンパイルと実行
- ・パッケージの使用 (パッケージ宣言とインポート)
ここで覚えることpackage 宣言は import より前、ファイルの先頭に1つだけ書きます。同じ名前のクラスを持つパッケージを *(ワイルドカード)で両方 import すると、使うときに曖昧でエラーになります。
- 2
Javaの基本データ型と文字列の操作
- ・変数の宣言および初期化と変数のスコープ
- ・ローカル変数型推論 (var) SE 17 で加わった
- ・文字列の作成と操作 (テキスト・ブロックを含む) SE 17 で加わった
- ・配列 (一次元配列、二次元配列)の宣言、インスタンス化、初期化および使用
- ・ArrayList の使用
ここで覚えることvar は右辺の型で決まり、あとから別の型には変えられません。String は不変で、メソッドは新しい文字列を返すだけです。ArrayList の remove は、int を渡すと添字、オブジェクトを渡すと要素の指定になります。
- 3
演算子と制御構造
- ・分岐文 (if、if/else、switch) の使用
- ・繰り返し文 (do/while、while、for文および拡張for文) の使用
- ・break、continue を使用した制御
- ・switch 式の使用 SE 17 で加わった
ここで覚えることswitch 式は値を返し、case の中に複数の文を書くときは yield で値を返します。値を取る switch 式は、すべての場合を網羅する必要があります。従来の switch 文は break が無いと次の case へ続きます。
- 4
クラスの定義とインスタンスの使用
- ・Javaクラスの定義とインスタンス化とオブジェクトのライフサイクル
- ・メソッドとコンストラクタの作成
- ・メソッドのオーバーロード
- ・static変数とstaticメソッド
- ・アクセス修飾子の使用
- ・instanceof のパターン・マッチング SE 17 で加わった
- ・レコード・クラスの作成と使用 SE 17 で加わった
ここで覚えることinstanceof のパターン変数は、一致したと確実に言える範囲でだけ使えます。レコードは toString・equals・アクセサを自動で作ってくれる、値を運ぶためのクラスです。コンストラクタの引数名とフィールド名が同じときは this を付けます。
- 5
継承とインタフェースの使用
- ・スーパークラスとサブクラスの作成と使用
- ・抽象クラスの作成と継承
- ・メソッドのオーバーライド
- ・参照型のキャストとポリモーフィックなメソッド呼び出し
- ・final クラスの作成と使用
- ・インタフェースの作成と実装
- ・デフォルト・メソッドとプライベート・メソッドの使用
- ・シール・クラスの作成と使用 SE 17 で加わった
ここで覚えることメソッドは実体のクラスで選ばれますが、フィールドは変数の型で決まります。同じ default メソッドを持つ2つのインタフェースを実装したら、自分で上書きして解決します。sealed の permits に無いクラスは継承できません。
- 6
例外処理
- ・例外処理の仕組みとチェック例外、非チェック例外、エラーの違い
- ・try-catch文による例外処理
- ・try-with-resources 文による例外処理
- ・カスタム例外の作成
- ・multi-catch 句の使用
ここで覚えることcatch は上から順に調べるので、親クラスを先に書くと子の catch に届かずエラーです。チェック例外は、catch するか throws で宣言しないとコンパイルが通りません。try-with-resources は、開いた順と逆に close します。
章ごとの練習問題(出力当て)
短い Java のコードを読んで、実行すると何が表示されるかを選びます(全29問)。選ぶと正解と理由が出ます。答えはどこにも送られず、記録もしません。問題はすべてオリジナルで、試験の実際の問題ではありません。
出力は OpenJDK 17 で実際にコンパイル・実行して、答えと一字一句同じになることを確かめたものです(OpenJDK 17.0.21)。「コンパイルエラー」「実行時に例外」が答えの問題も、本物の javac と java で確かめています。
第1章 Java の概要と簡単なJavaプログラムの作成
0/4 問正解 (答えた問題:0/4)
問1
import java.util.List;
package app;
public class Main {
public static void main(String[] args) {
System.out.println("hi");
}
}
実行すると何が表示される?
package 宣言は、ファイルの先頭(コメントを除く)に書く決まりです。import より後ろに置くとコンパイルエラーになります。順序は package、import、クラスの宣言です。
問2
public class Main {
public static void main(String[] args) {
String name = args[0];
System.out.println("Hello, " + name);
}
}
条件:コマンドライン引数を付けずに java Main で実行したとき
実行すると何が表示される?
引数を付けなければ args は要素が0個の配列です。args[0] は存在しない要素なので、実行時に例外になります。コンパイルは通ります。java Main Taro のように引数を付けると動きます。
問3
import java.util.*;
import java.sql.*;
public class Main {
public static void main(String[] args) {
Date today = null;
System.out.println(today);
}
}
実行すると何が表示される?
java.util と java.sql のどちらにも Date クラスがあります。* で両方を import すると、Date と書いた箇所がどちらか決められず「曖昧」としてコンパイルエラーになります。java.util.Date のように完全な名前で書けば解決します。
問4
public class Main {
static {
System.out.println("A");
}
public static void main(String[] args) {
System.out.println("B");
}
static {
System.out.println("C");
}
}
実行すると何が表示される?
static 初期化ブロックは、クラスが読み込まれて初期化されるときに、書かれた順に実行されます。main メソッドが呼ばれるのはその後なので、A、C、B の順です。
第2章 Javaの基本データ型と文字列の操作
0/5 問正解 (答えた問題:0/5)
問5
public class Main {
public static void main(String[] args) {
var count = 10;
count = 2.5;
System.out.println(count);
}
}
実行すると何が表示される?
var は右辺から型を決めるだけで、動的な型になるわけではありません。count は int で固定され、double の 2.5 を代入しようとするとコンパイルエラーです。
問6
public class Main {
public static void main(String[] args) {
String s = "abc";
s.toUpperCase();
s.concat("def");
System.out.println(s);
}
}
実行すると何が表示される?
String は不変(変更できない)で、toUpperCase や concat は元の文字列を書き換えず、新しい文字列を返します。返り値を受け取っていないので、s は "abc" のままです。
問7
public class Main {
public static void main(String[] args) {
String t = """
Hello
World
""";
System.out.print(t);
}
}
実行すると何が表示される?
テキスト・ブロックは、各行に共通する先頭の空白(インデント)を取り除きます。閉じの """ の位置も基準に含まれるため、ここでは Hello の行が左端になり、World はそれより2つ深い位置に残ります。最後の行の改行も含まれます。
問8
public class Main {
public static void main(String[] args) {
int[][] grid = new int[2][];
System.out.println(grid.length);
System.out.println(grid[0]);
}
}
実行すると何が表示される?
new int[2][] は、外側の長さ 2 だけを決めて、内側の配列はまだ作りません。内側は参照型の初期値の null です。null を println に渡しても例外にはならず、null と表示されます。
問9
import java.util.*;
public class Main {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>(List.of(10, 20, 30));
list.remove(1);
list.remove(Integer.valueOf(10));
System.out.println(list);
}
}
実行すると何が表示される?
remove(1) は int を渡しているので「添字 1 の要素」を消し、20 がなくなって [10, 30] になります。remove(Integer.valueOf(10)) はオブジェクトを渡しているので「値が 10 の要素」を消し、[30] が残ります。
第3章 演算子と制御構造
0/5 問正解 (答えた問題:0/5)
問10
public class Main {
public static void main(String[] args) {
int day = 3;
String type = switch (day) {
case 1, 7 -> "off";
case 2, 3, 4 -> {
String t = "work";
yield t + "!";
}
default -> "?";
};
System.out.println(type);
}
}
実行すると何が表示される?
switch 式は値を返します。-> のあとを { } のブロックにしたときは、yield で値を返します。day は 3 なので "work" に "!" を足した work! です。
問11
public class Main {
public static void main(String[] args) {
int x = 2;
switch (x) {
case 1:
System.out.print("A");
default:
System.out.print("B");
case 3:
System.out.print("C");
break;
case 4:
System.out.print("D");
}
}
}
実行すると何が表示される?
x が 2 に当てはまる case は無いので default から始まります。default の位置が途中でも、break が無ければ下の case 3 へ続きます。C のあとの break で抜けるので D は出ません。
問12
public class Main {
public static void main(String[] args) {
int level = 2;
String label = switch (level) {
case 1 -> "low";
case 2 -> "mid";
};
System.out.println(label);
}
}
実行すると何が表示される?
値を返す switch 式は、すべての場合を網羅する必要があります。int は 1 と 2 以外の値もあり得るので、default が無いとコンパイルエラーです。
問13
public class Main {
public static void main(String[] args) {
outer:
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 3; j++) {
if (j == 2) continue outer;
System.out.println(i + "-" + j);
}
}
}
}
実行すると何が表示される?
continue outer は、内側ではなくラベルの付いた外側のループの次の周回へ移ります。j が 2 になった時点で内側を打ち切るので、各 i で j=1 のときしか表示されません。
問14
public class Main {
public static void main(String[] args) {
int x = 5;
x += 3.7;
byte b = 10;
b += 5;
System.out.println(x + " " + b);
}
}
実行すると何が表示される?
複合代入演算子(+= など)は、右辺の型へ広げて計算したあと、左辺の型へ自動で戻す(切り捨てる)決まりです。5 + 3.7 = 8.7 は int に戻って 8 になり、byte への += もエラーになりません。
第4章 クラスの定義とインスタンスの使用
0/5 問正解 (答えた問題:0/5)
問15
public class Main {
public static void main(String[] args) {
Object o = "hello";
if (o instanceof String s && s.length() > 3) {
System.out.println(s.toUpperCase());
} else {
System.out.println("no");
}
}
}
実行すると何が表示される?
instanceof String s は、o が String なら s に取り出して代入する書き方(パターン・マッチング)です。&& の右側では s がもう使えて、長さは 5 なので条件を満たし、大文字にした HELLO が出ます。
問16
public class Main {
public static void main(String[] args) {
Object o = "hello";
if (o instanceof String s || s.length() > 3) {
System.out.println("yes");
}
}
}
実行すると何が表示される?
パターン変数 s が使えるのは、一致したと確実に言える場所だけです。|| の右側は左が偽(一致しなかった)のときに評価されるので、s は存在せずコンパイルエラーになります。&& なら通ります。
問17
record Point(int x, int y) {}
public class Main {
public static void main(String[] args) {
Point p = new Point(1, 2);
Point q = new Point(1, 2);
System.out.println(p);
System.out.println(p.equals(q) + " " + (p == q));
}
}
実行すると何が表示される?
レコードは toString を、Point[x=1, y=2] の形で自動で作ります。equals は全部の成分が等しければ true ですが、== は別々に new したオブジェクトどうしなので false です。
問18
record Age(int value) {
Age {
if (value < 0) {
throw new IllegalArgumentException("negative: " + value);
}
}
}
public class Main {
public static void main(String[] args) {
Age a = new Age(20);
System.out.println(a.value());
Age b = new Age(-1);
System.out.println(b.value());
}
}
実行すると何が表示される?
Age { ... } はコンパイラが作るコンストラクタに前処理を足す書き方(コンパクト・コンストラクタ)です。-1 を渡した2回目の new で例外が投げられ、キャッチしていないのでプログラムはそこで止まります。
問19
class Person {
String name;
Person(String name) {
name = name;
}
}
public class Main {
public static void main(String[] args) {
Person p = new Person("Aki");
System.out.println(p.name);
}
}
実行すると何が表示される?
コンストラクタの中の name は、引数の name(内側)を指します。name = name は引数を自分自身に代入するだけで、フィールドには何も入りません。this.name = name と書く必要があります。フィールドは null のままで、表示は null です。
第5章 継承とインタフェースの使用
0/5 問正解 (答えた問題:0/5)
問20
class Parent {
String name = "parent";
String who() { return "Parent.who"; }
}
class Child extends Parent {
String name = "child";
String who() { return "Child.who"; }
}
public class Main {
public static void main(String[] args) {
Parent p = new Child();
System.out.println(p.name + " " + p.who());
}
}
実行すると何が表示される?
メソッドは実体(Child)のものが動きます(オーバーライド)。一方フィールドにはオーバーライドが無く、変数の型(Parent)で決まります。そのため name は parent、who() は Child.who です。
問21
final class Base {
void hi() { System.out.println("hi"); }
}
class Sub extends Base {
}
public class Main {
public static void main(String[] args) {
new Sub().hi();
}
}
実行すると何が表示される?
final を付けたクラスは、継承できません。Sub が Base を extends している時点でコンパイルエラーです。(final のメソッドはオーバーライドできない、という別の決まりもあります。)
問22
interface A {
default String hello() { return "A"; }
}
interface B {
default String hello() { return "B"; }
}
class C implements A, B {
}
public class Main {
public static void main(String[] args) {
System.out.println(new C().hello());
}
}
実行すると何が表示される?
同じ名前の default メソッドを持つインタフェースを2つ実装すると、どちらを使うか決められません。C の中で hello() を自分で上書きする必要があります(A.super.hello() で一方を呼ぶこともできます)。
問23
interface Greeter {
default String greet(String name) {
return prefix() + name;
}
private String prefix() {
return "Hello, ";
}
}
class Jp implements Greeter {
}
public class Main {
public static void main(String[] args) {
System.out.println(new Jp().greet("Aki"));
}
}
実行すると何が表示される?
インタフェースには、本体を持つ default メソッドと、その中だけで使う private メソッドを書けます。Jp は greet を実装しなくても使え、greet の中から private の prefix() を呼べます。
問24
sealed interface Shape permits Circle, Square {}
record Circle(double r) implements Shape {}
record Square(double s) implements Shape {}
final class Triangle implements Shape {}
public class Main {
public static void main(String[] args) {
Shape s = new Circle(1);
System.out.println(s);
}
}
実行すると何が表示される?
sealed なインタフェースやクラスを実装・継承できるのは、permits に書いたものだけです。Triangle は書かれていないので、Circle と Square の部分に問題がなくてもコンパイルエラーになります。
第6章 例外処理
0/5 問正解 (答えた問題:0/5)
問25
public class Main {
public static void main(String[] args) {
try {
int[] a = new int[1];
a[2] = 1;
} catch (Exception e) {
System.out.println("E");
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("A");
}
}
}
実行すると何が表示される?
catch は上から順に調べます。親クラスの Exception を先に書くと、ArrayIndexOutOfBoundsException はすでに捕まえられているので、後ろの catch には絶対に届きません。コンパイラがこれをエラーにします。
問26
public class Main {
static int f() {
try {
return 1;
} finally {
System.out.println("F");
}
}
public static void main(String[] args) {
System.out.println(f());
}
}
実行すると何が表示される?
try の中で return しても、finally は必ず実行されます。1 を返す値が決まったあと、finally の F を表示してから f() が戻るので、main の println が 1 を表示するのは最後です。
問27
class Res implements AutoCloseable {
private final String name;
Res(String name) {
this.name = name;
System.out.println("open " + name);
}
public void close() {
System.out.println("close " + name);
}
}
public class Main {
public static void main(String[] args) {
try (Res a = new Res("A"); Res b = new Res("B")) {
System.out.println("body");
}
}
}
実行すると何が表示される?
try-with-resources は、書いた順に開き、本体を実行したあと、開いた順と逆に close します。後から開いた B が先に閉じられるので、close B のあとに close A です。
問28
public class Main {
static void risky() throws Exception {
throw new Exception("boom");
}
public static void main(String[] args) {
risky();
System.out.println("done");
}
}
実行すると何が表示される?
Exception のようなチェック例外を投げるメソッド(throws Exception)は、呼ぶ側で try-catch するか、自分も throws で宣言する必要があります。どちらも無いのでコンパイルが通りません。
問29
public class Main {
public static void main(String[] args) {
try {
String s = null;
System.out.println(s.length());
} catch (ArithmeticException | NullPointerException e) {
System.out.println("caught " + e.getClass().getSimpleName());
} finally {
System.out.println("end");
}
}
}
実行すると何が表示される?
null に対して length() を呼ぶと NullPointerException になります。multi-catch(A | B)は、どちらの例外でも同じ処理で受けられる書き方で、ここで捕まります。finally は最後に必ず実行されます。
よくある勘違い
- var は何でも入れられる変数、と思ってしまう。var は右辺から型を決めるだけで、決まった型はあとから変わりません。var count = 10; のあとに 2.5 は入れられません。
- String のメソッドは自分自身を書き換える、と思ってしまう。String は不変なので、toUpperCase や concat は新しい文字列を返すだけです。返り値を受け取らないと何も変わりません。
- 値を返す switch 式の default は省略できる、と思ってしまう。int や String では、すべての場合を網羅する必要があり、default が無いとコンパイルエラーです。
- instanceof で取り出した変数は、そのあとどこでも使える、と思ってしまう。一致したと確実に言える範囲(&& の右側や if の中など)でだけ使えます。|| の右側では使えません。
- フィールドもメソッドと同じようにオーバーライドされる、と思ってしまう。メソッドは実体のクラスで選ばれますが、フィールドは変数の型で決まります。
- catch は書く順番を気にしなくてよい、と思ってしまう。親クラスの例外を先に書くと、あとの子クラスの catch には届かず、コンパイルエラーになります。
- レコードのフィールドは、あとから書き換えられる、と思ってしまう。レコードの成分は final なので、作ったあとで書き換えることはできません。
そもそも Java Silver とは
Java の基本文法とオブジェクト指向を、一通り使いこなせることを示す資格。
Java Silverは、Oracle が行っている Java の認定資格で、入門の Bronze の次にあたります。変数と文字列、条件分岐とループ、クラスとインスタンス、継承とインタフェース、例外処理までが範囲です。
Bronze と違って、Java の特定のバージョンに結びついた試験です。SE 11 の試験は2026年11月30日に、SE 17 の試験は2027年2月28日に配信が終わり、その先は SE 25 に対応した試験が配信される予定です。このページの範囲と練習問題は SE 17 の試験のものです。SE 25 対応の試験の範囲は、試験の開始時に発表される予定なので、発表され次第、更新します。
Bronze・Silver・Gold の位置づけ
-
Bronze
入門。基本の文法が中心です。Java Bronze を整えるへ。
-
Silver
Bronze の次。このページが対象です。
-
Gold
Silver の上の資格です。このサイトではまだ扱っていません。
どんな場面で役立つか
-
業務システム開発の現場に入る前に
Java で作られた業務システムの保守や開発に配属される人が、基礎の抜けを確かめる目安にできます。
-
新人研修の次の目標として
Bronze のあとの目標にすると、継承や例外処理まで学ぶ道筋ができます。
-
新しい文法を整理するときに
var・switch 式・レコードなど、新しい版で加わった書き方を、体系的に学び直せます。
-
エラーの読み方を身につけたいときに
コンパイルエラーになる理由や例外の出方を理解すると、実務のデバッグが楽になります。
言語そのものの紹介は Java を整える、情報処理の入口の国家資格は ITパスポートを整えるにあります。
あわせて見る
Oracle、Java は Oracle およびその関連会社の商標または登録商標です。このページは Oracle の公式のものではなく、試験の合格を保証するものでもありません。
このツールについて
Java Silver(SE 17)の試験範囲を、章ごとの練習問題で確かめます。出力当てが中心で、答えは本物の Java で確かめたものです。
Java Silver(SE 17)の試験範囲6章と、章ごとの練習問題29問。SE 17 で加わった範囲に印つき。SE 25 対応の試験は、範囲の発表後に更新します。
主な機能
- 試験の基本(試験番号・形式・90分・60問・合格ライン65%)と Oracle 公式ページへのリンク
- 「いつ・どれを受ける?」早見(SE 11 は2026/11/30、SE 17 は2027/2/28 に配信終了、SE 25 は配信予定)
- 試験範囲マップ6章と、SE 17 で加わった範囲の印(var・テキスト・ブロック・switch 式・instanceof・レコード・シール・クラス)
- 章ごとの練習問題29問(コンパイルエラー・例外・出力)
- 章ごとの正答数表示(記録は保存しない)
- よくある勘違い7つ
- 出力は OpenJDK 17 で照合済み・送信ゼロ
よくある質問
Q. Java Silver の SE 11 と SE 17 の試験は、いつまで受けられますか?
A. 日本語の SE 11 の試験(1Z0-815-JPN)は2026年11月30日、SE 17 の試験(1Z0-825-JPN)は2027年2月28日に配信が終わります(2026年9月7日の Oracle の発表)。配信が終わっても、取得した資格がすぐに失効するわけではありません。
Q. SE 25 に対応した Silver の試験はありますか?
A. 2026年11月下旬から配信を始める予定とされています。試験番号と試験範囲は未発表で、試験の開始時に Oracle から発表される予定です。このページの範囲と練習問題は SE 17 の試験のもので、SE 25 の範囲が発表されたら更新します。
Q. Silver SE 17 の試験の形式を教えてください。
A. 選択問題で、試験時間は90分、問題数は60問、合格ラインは65%です(Oracle の公式ページで2026年11月3日に確認)。試験番号は 1Z0-825-JPN です。
入力値はURLの「#」以降に入るためサーバーには送信されません。リンクを開くと同じ状態を復元します。
続けて整える
データの時点:2026年11月3日に確認(Oracle University『Java認定試験の提供予定』(2026/9/7)) 次の更新予定:2026年11月ごろ
この内容は、研修でも扱っています
totonoe.tech を運営する株式会社Koinobori は、法人向けの研修サービス「NOBORIBA®」も運営しています。 ここで手を動かした内容を、講師から教わる形の研修です。このページの道具は無料のまま、登録もいりません。