問題
次のコードをコンパイル、実行するとどうなりますか。
public class Main {
int i;
public Main(int i) {
i = ++i;
}
public void process() {
int sum = 0;
for (var j = i; j < 10; j++) {
if (i++ % 3 != 0)
continue;
sum += j;
}
System.out.println(sum);
}
public static void main(String... args) {
new Main(3).process();
}
}
選択肢
A)ArrayIndexOutOfBoundsException がスローされる
B)15 が出力される
C)0 が出力される
D)13 が出力される
E)コンパイルエラーになる
F)18 が出力される
解答
A)ArrayIndexOutOfBoundsException がスローされる
B)15 が出力される
C)0 が出力される
D)13 が出力される
E)コンパイルエラーになる
F)18 が出力される
解説
このコードを詳しく見ていきましょう。
コードの解説
1. コンストラクタ
public Main(int i) {
i = ++i;
}
- ここで
i
はメソッドの引数として受け取った値ですが、クラスのインスタンス変数this.i
ではなく、ローカル変数i
に代入されています。したがって、インスタンス変数this.i
は初期化されず、デフォルト値の0
のままになります。
2. processメソッド
public void process() {
int sum = 0;
for (var j = i; j < 10; j++) {
if (i++ % 3 != 0)
continue;
sum += j;
}
System.out.println(sum);
}
i
の初期値は0
ですので、j
も0
から始まります。- ループは
j < 10
になるまで続きます。
ループの動作
- j = 0
if (0++ % 3 != 0)
→0 % 3 == 0
なので、条件が真でないためcontinue
しない。sum += 0
→sum
は0
になる。
- j = 1
if (1++ % 3 != 0)
→1 % 3 != 0
なので、continue
し、sum
は変わらず。
- j = 2
if (2++ % 3 != 0)
→2 % 3 != 0
なので、continue
し、sum
は変わらず。
- j = 3
if (3++ % 3 != 0)
→3 % 3 == 0
なので、条件が真でないためcontinue
しない。sum += 3
→sum
は3
になる。
- j = 4
if (4++ % 3 != 0)
→4 % 3 != 0
なので、continue
し、sum
は変わらず。
- j = 5
if (5++ % 3 != 0)
→5 % 3 != 0
なので、continue
し、sum
は変わらず。
- j = 6
if (6++ % 3 != 0)
→6 % 3 == 0
なので、条件が真でないためcontinue
しない。sum += 6
→sum
は9
になる。
- j = 7
if (7++ % 3 != 0)
→7 % 3 != 0
なので、continue
し、sum
は変わらず。
- j = 8
if (8++ % 3 != 0)
→8 % 3 != 0
なので、continue
し、sum
は変わらず。
- j = 9
if (9++ % 3 != 0)
→9 % 3 == 0
なので、条件が真でないためcontinue
しない。sum += 9
→sum
は18
になる。
ループの終了
ループが j < 10
の条件により、j
が 10
になるとループが終了します。
最終的な出力
最後に、System.out.println(sum);
によって sum
の値(18
)が出力されます。
したがって、正しい選択肢は F)18 が出力される です。
対象資格:Java SE17 認定資格