難易度は Level 1(やさしめ)〜Level 5(難関) の5段階です。
Java Bronze SE (1Z0-818-JPN)のサンプル問題(本番形式・解説付き)
Java Bronze SE (1Z0-818-JPN)(Oracle・Java SE Bronze(Oracle Certified Java Programmer, Bronze SE))の出題形式を、実際の問題で確かめられます。ここに掲載する5問は、無料の会員登録で解ける模試 第1回(60問)の冒頭から抜粋したオリジナル問題です。当サイトは全420問を本番CBT準拠の形式で収録しており、この5問はそのごく一部にあたります。
設問1
次のコード
1: // Hello.java
2: public class Hello {
3: public static void main(String[] args) {
4: System.out.println("Hello");
5: }
6: }
7: // 実行したコマンド
8: // javac Hello.java行8 のコマンドに続けて実行し、このプログラムを動かすコマンドはどれか。
- java Hello.class
- javac Hello
- javac Hello.class
- java Hello(正解)
解説
Java は「javac でコンパイルする」「java で実行する」という2段階で動かします。行8 でコンパイルが終わり Hello.class ができているので、次は java コマンドで実行します。このとき java に渡すのは、ファイル名ではなく実行したいクラスの名前です。JDK 17.0.20.1 で java Hello を実行すると Hello と1行表示されました。
他の選択肢が誤りである理由
- 「java Hello.class」java に渡すのはクラス名であり、ファイル名ではありません。実測では エラー: メイン・クラスHello.classを検出およびロードできませんでした と表示され、実行できませんでした。
- 「javac Hello」javac はコンパイルのためのコマンドで、実行はできません。さらに javac には拡張子まで含めたソースファイル名を渡すため、実測では エラー: クラス名'Hello'が受け入れられるのは、注釈処理が明示的にリクエストされた場合のみです と表示されました。
- 「javac Hello.class」javac はコンパイルのためのコマンドなので、これを実行してもプログラムは動きません。またコンパイルの対象はソースファイル Hello.java であり、Hello.class ではありません。
設問2
次のコード
1: // Greeting.java
2: public class Greeting {
3: public static void main(String[] args) {
4: System.out.println("good morning");
5: }
6: }
7: // 実行したコマンド
8: // javac Greeting.java行8 のコマンドが成功したときに新しくできるファイルはどれか。
- その環境向けの実行ファイル Greeting.exe
- メソッド単位のファイル main.class
- クラスファイル Greeting.class(正解)
- 拡張子の付かない実行ファイル Greeting
解説
javac は、ソースファイル(拡張子 .java)を読み込んで、クラスごとにクラスファイル(拡張子 .class)を作ります。ファイル名はクラス名にもとづいて決まるので、Greeting クラスからは Greeting.class ができます。JDK 17.0.20.1 で実測したところ、javac は画面に何も表示せずに終了し、同じディレクトリに Greeting.class が作られました。
他の選択肢が誤りである理由
- 「その環境向けの実行ファイル Greeting.exe」javac が作るのは、その環境専用の実行ファイルではありません。Java は環境を選ばずに動かすため、クラスファイルという共通の形式を作ります。
- 「メソッド単位のファイル main.class」クラスファイルはメソッド単位ではなくクラス単位でできます。main はメソッドの名前なので、main.class というファイルはできません。
- 「拡張子の付かない実行ファイル Greeting」javac が作るのはクラスファイルで、名前には必ず `.class` が付きます。拡張子の付かない実行ファイルができるのは、別の言語のコンパイラで機械語に変換した場合です。実行するときに `java Greeting` とクラス名を書くので同じ名前のファイルができそうに見えますが、実測でも `javac Greeting.java` の後に残るのは `Greeting.java` と `Greeting.class` の2つだけでした。
設問3
次のコード
1: // Report.java
2: public class Summary {
3: public static void main(String[] args) {
4: System.out.println("summary");
5: }
6: }
7: // 実行したコマンド
8: // javac Report.java行8 のコマンドを実行した結果として正しいものはどれか。
- コンパイルは成功し、Summary.class ができます。
- コンパイルに失敗し、クラスファイルはできません。(正解)
- コンパイルは成功し、Report.class ができます。
- コンパイルは成功しますが、実行するとクラスが見つからず失敗します。
解説
public を付けたクラスは、クラス名と同じ名前のソースファイルに書かなければなりません。行2 のクラス名は Summary なので、ファイル名も Summary.java である必要があります。ここではファイル名が Report.java なので食い違い、コンパイルの段階で止まります。JDK 17.0.20.1 の実測では Report.java:1: エラー: クラス Summaryはpublicであり、ファイルSummary.javaで宣言する必要があります と表示され、エラー1個 で終了し、クラスファイルは1つもできませんでした。
他の選択肢が誤りである理由
- 「コンパイルは成功し、Summary.class ができます。」ファイル名とクラス名が食い違っているため、コンパイルはここで止まります。クラスファイルは作られません。
- 「コンパイルは成功し、Report.class ができます。」クラスファイルの名前はファイル名ではなくクラス名から決まるので、Report.class という名前になることはありません。そもそもコンパイル自体が成功しません。
- 「コンパイルは成功しますが、実行するとクラスが見つからず失敗します。」この食い違いは実行時ではなくコンパイル時に見つかります。javac がエラーを出すため、実行の段階まで進みません。
設問4
次のコード
1: // Menu.java
2: public class Menu {
3: public static void main(String[] args) {
4: System.out.println(Item.name());
5: }
6: }
7: class Item {
8: static String name() {
9: return "coffee";
10: }
11: }
12: // 実行したコマンド
13: // javac Menu.java行13 のコマンドが成功した直後にできるクラスファイルはどれか。
- Menu.class と Item.class の2つができます。(正解)
- public が付いた Menu.class だけができます。
- Item.class だけができ、Menu.class はできません。
- Menu.class が1つだけでき、その中に Item も含まれます。
解説
1つのソースファイルに複数のクラスを書くことができ、javac はその中のクラスを1つずつクラスファイルにします。ここには Menu と Item の2つのクラスがあるので、クラスファイルも2つできます。JDK 17.0.20.1 で実測したところ、javac Menu.java の直後のディレクトリには Item.class と Menu.class の両方がありました。
他の選択肢が誤りである理由
- 「public が付いた Menu.class だけができます。」public が付いているかどうかは、クラスファイルができるかどうかとは関係ありません。Item もクラスファイルになります。
- 「Item.class だけができ、Menu.class はできません。」コンパイルの対象は Menu.java に書かれたクラス全体です。Menu クラスも同じようにクラスファイルになります。
- 「Menu.class が1つだけでき、その中に Item も含まれます。」クラスファイルはクラスごとに別々に作られます。ほかのクラスの中にまとめられることはありません。
設問5
次のコード
1: // Timer.java
2: public class Timer {
3: public static void main(String args) {
4: System.out.println("start");
5: }
6: }
7: // 実行したコマンド
8: // javac Timer.java
9: // java Timer2つのコマンドを順に実行した結果として正しいものはどれか。
- 引数の型が正しくないため、コンパイルの段階で失敗します。
- コンパイルも実行も成功し、start と表示されます。
- コンパイルは成功し、start が引数の個数だけ繰り返して表示されます。
- コンパイルは成功しますが、実行時にメイン・メソッドが見つかりません。(正解)
解説
java コマンドが最初に呼び出すメソッドは、public static void main(String[] args) という決まった形をしていなければなりません。行3 は引数が String[] ではなく String になっているため、この決まった形とは別のメソッドとして扱われます。文法としては正しいのでコンパイルは成功しますが、実行の段階で呼び出す相手が見つかりません。JDK 17.0.20.1 の実測では、javac は正常に終了して Timer.class ができ、java Timer は エラー: メイン・メソッドがクラスTimerで見つかりません。次のようにメイン・メソッドを定義してください。 と表示して終了しました。
他の選択肢が誤りである理由
- 「引数の型が正しくないため、コンパイルの段階で失敗します。」引数の型が String であること自体は文法違反ではありません。実測では javac は何も表示せずに終了し、Timer.class ができました。
- 「コンパイルも実行も成功し、start と表示されます。」この形のメソッドは実行の入口として選ばれないため、start が表示されることはありません。
- 「コンパイルは成功し、start が引数の個数だけ繰り返して表示されます。」行4 は1回しか書かれておらず、繰り返す仕組みもありません。そもそもこのメソッドは実行の入口になりません。
続きは、会員登録なしでそのまま50問解けます。採点と解説つきで、上と同じ本物の問題です。
登録なしで50問解く