main メソッド(コマンドライン引数配列のインデックス)難易度 標準無料
次のコードを 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 }
- A
1を出力後、ArrayIndexOutOfBoundsExceptionがスローされる - Bコンパイルエラー(
args[1]は範囲外なのでコンパイル時に検出される) - C
2改行hello(クラス名Q7も引数として数えられる) - D
1改行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の実際の長さを知り得ないため、この行はコンパイル自体には通る。 - C
argsに渡されるのはクラス名の後ろの引数のみ。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が作成し、独立した検証を経た解説です(有資格者による監修は経ていません)