こんにちは、かつコーチです。
「public static void main(String[] args)のargsって、結局何のためにあるんだろう」と気になったことはありませんか。
コマンドライン引数(プログラム実行時にターミナルから渡す値)を使うと、実行のたびにプログラムの動作を切り替えられます。
この記事では、argsの受け取り方と、実務での活用イメージを解説します。
コマンドライン引数とは
実行時に外部から値を渡す仕組み
コマンドライン引数とは、プログラムを実行するタイミングで、ターミナルから渡す追加の値のことです。
Javaでは、mainメソッドの引数String[] argsとして受け取ります。
public class Greeting {
public static void main(String[] args) {
System.out.println("引数の数: " + args.length);
}
}
このプログラムを次のように実行すると、渡した引数がそのままargs配列に格納されます。
java Greeting Tokyo Osaka
引数の数: 2
なぜコマンドライン引数が必要なのか
コマンドライン引数を使えば、プログラムのコードを毎回書き換えなくても、実行時に渡す値を変えるだけで異なる動作をさせられます。
たとえば「ファイルを変換するツール」を作る場合、変換対象のファイル名をコードに直接書いてしまうと、別のファイルを処理したいときにコードを書き換えてコンパイルし直す必要が出てきます。
コマンドライン引数として受け取れるようにしておけば、java Converter input.txtのように、実行のたびに対象を切り替えられます。
基本の書き方・実装手順
手順1:引数を1つずつ取り出す
argsはString型の配列なので、インデックスを指定して各要素にアクセスできます。
public class Greeting {
public static void main(String[] args) {
if (args.length > 0) {
System.out.println(args[0] + "さん、こんにちは。");
} else {
System.out.println("名前を指定してください。");
}
}
}
java Greeting 田中
田中さん、こんにちは。
手順2:拡張for文で全要素を処理する
public class ArgsPrinter {
public static void main(String[] args) {
for (String arg : args) {
System.out.println("引数: " + arg);
}
}
}
java ArgsPrinter Tokyo Osaka Nagoya
引数: Tokyo
引数: Osaka
引数: Nagoya
手順3:数値として扱いたい場合は変換する
コマンドライン引数は必ずString型で渡ってくるため、数値として計算に使いたい場合は変換が必要です。
public class SumCalculator {
public static void main(String[] args) {
int a = Integer.parseInt(args[0]);
int b = Integer.parseInt(args[1]);
System.out.println("合計: " + (a + b));
}
}
java SumCalculator 3 5
合計: 8
Integer.parseInt()で文字列を整数に変換しています。
つまずきやすい設定・注意点
IntelliJ IDEAなどのIDEで実行する場合は、「実行構成(Run Configuration)」の設定画面でプログラム引数を指定する欄にあらかじめ値を入力しておく必要があります。
何も設定せずに実行ボタンを押すと、argsは要素数0の空配列になります。
よくあるつまずきポイント・エラー対処
引数を渡さずに配列アクセスしてエラーになる
初心者が最初につまずきやすいのが、引数が渡されなかった場合のチェックを忘れて、いきなりargs[0]にアクセスしてしまうケースです。
❌Before
public class Greeting {
public static void main(String[] args) {
System.out.println(args[0] + "さん、こんにちは。");
}
}
このプログラムを引数なしで実行すると、次の実行時エラーが発生します。
java Greeting
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0
私も学習し始めの頃、動作確認のたびに引数を付け忘れてこのエラーを何度も見ました。ArrayIndexOutOfBoundsExceptionは「配列の存在しないインデックスにアクセスした」ことを示すエラーで、length 0という部分から「そもそも配列が空だった」ことが読み取れます。
✅After
配列にアクセスする前に、args.lengthで要素数を確認する習慣をつけます。
public class Greeting {
public static void main(String[] args) {
if (args.length == 0) {
System.out.println("名前を指定してください。");
return;
}
System.out.println(args[0] + "さん、こんにちは。");
}
}
args.length == 0の場合は早めにreturnで処理を終えることで、想定外のインデックスアクセスを防げます。
数値変換に失敗してNumberFormatExceptionになる
数値として扱うつもりの引数に、数字以外の文字列が渡された場合もエラーになります。
java SumCalculator 3 abc
Exception in thread "main" java.lang.NumberFormatException: For input string: "abc"
Integer.parseInt()は、変換できない文字列を渡されるとNumberFormatExceptionを投げます。
外部から渡される値は常に「想定外の形式かもしれない」と考え、後の記事で扱う例外処理(try-catch)と組み合わせて扱うのが安全です。
応用・一歩先の使い方
オプション形式の引数を自作で処理する
実務のCLIツールでは、--name=田中のような「オプション形式」の引数もよく見かけます。
標準機能だけでも、=で分割する処理を自作すれば簡易的に対応できます。
public class OptionParser {
public static void main(String[] args) {
for (String arg : args) {
if (arg.startsWith("--name=")) {
String name = arg.substring("--name=".length());
System.out.println("名前: " + name);
}
}
}
}
本格的なCLIツールを作りたい場合は、こうした処理を毎回自作するのではなく、専用のライブラリを使う方法もあります。
簡単なCLIツールの作り方については、後半の実践プロジェクト編で改めて取り上げる予定です。
まとめ
この記事のポイント
- コマンドライン引数は、実行時にターミナルから渡す値で、
main(String[] args)で受け取る argsは常にString型の配列で、数値として使うにはInteger.parseInt()などで変換が必要- 引数が渡されていない状態でアクセスすると
ArrayIndexOutOfBoundsExceptionが発生する - 数値変換に失敗すると
NumberFormatExceptionが発生するため、入力値の検証が重要
次に読むべき記事
- メソッドの基本や引数の扱いをまだ確認していない方は、メソッドの定義と引数の基本の記事もあわせてご覧ください
- クラスとオブジェクトの基本については、次章の記事で解説します
タグ: Java, 初心者向け, 基本文法