【Java】実行時引数をいろいろ変えてmain(String[] args)の中身を見てみよう


ちょこちょこ気にはなってたんだけどあんまり深く追求しようとしていなかった
起動方法別のmain(String[] args)の捉え方についてまとめる。


 


 
例えば以下のようなクラスをつくる。

public class ArgumentCheckTest {  
public static void main(String[] args) throws Exception {  
  
	if (args == null) {  
		throw new Exception("引数がnullです。");  
	}  
	if (args.length == 0) {  
		throw new Exception("引数が未指定です。");  
	}  
	String arg = args[0];  
	if (arg.trim().length() == 0) {  
		throw new Exception("引数が空文字です。");  
	}  
	System.out.println("引数は" + arg + "です。");  
  
}  

}


これをいろんなやり方で起動してみる。
以下が実験結果。
ちなみにWindowsマシン上での実行結果です。

No実行時コマンド結果

1
java ArgumentCheckTest  
※引数全く無
Exception in thread "main" java.lang.Exception: 引数が未指定です。  
        at ArgumentCheckTest.main(ArgumentCheckTest.java:9)  
2
java ArgumentCheckTest ""  
※引数に「""」と指定
Exception in thread "main" java.lang.Exception: 引数が空文字です。  
        at ArgumentCheckTest.main(ArgumentCheckTest.java:13)  
3
java ArgumentCheckTest ''  
※引数に「''」と指定
引数は''です。  
※Exception未発生
4
java ArgumentCheckTest *  
※引数に「*」と指定
引数はArgumentCheckTest.classです。  
※Exception未発生
5
java  ArgumentCheckTest %PATH%  
※引数に「%PATH%」と指定
引数は[環境変数PATHの中身がずらずらと出てくる]です。  
※Exception未発生






ふ~む。

main(String args)の、String argsがnullになる("null"という文字列ではなく、== nullでtrueになる、マジモンのnull)ことも
あるんじゃないかと思ったのだが、どうもそんなことはないようであるな。
だからargsに対する、nullかどうかのチェックは不要のようだ。
ただ、引数未指定で実行すると、要素数0の配列になるようだから、ノーチェックで

String arg = args[0];  

とやると落ちることもあるだろうな。
引数の要素数チェックはやっといたほうがいいでしょうね。




No.5のように、環境変数を渡すと、
環境変数そのものを示す文字列ではなく、その中身が評価されて渡される。
まあそっちの方がやりたいことに決まってるよな。。。
batファイルみたいなの作って、set /pでローカル環境変数を入力させて渡す、
っていうやり方もこれで可能となる。




ちなみにNo.4の実行結果でわかったことだが、
引数に「*」って指定するとなぜかクラスファイル名(ArgumentCheckTest)が引数として渡されたのは、
Javaの特殊仕様かと一瞬思ったけど、
「*」が「カレントディレクトリ配下の全ファイル」を示すワイルドカードであり、
たまたま「全ファイル」の一番先頭にこのJavaのクラスファイルがいたから、
それを単に取得して渡しているだけのWindowsのコマンドプロンプトの標準的な動き、
ということに過ぎないようだ。
実際、実行時は↓みたいなファイルが格納されている状況だった

2018/01/25  16:03    <DIR>          .  
2018/01/25  16:03    <DIR>          ..  
2018/01/25  16:04               951 ArgumentCheckTest.class  
2018/01/25  16:04               427 ArgumentCheckTest.java  


が、これに「aaa.txt」というのを無理やり加えて

2018/01/25  16:03    <DIR>          .  
2018/01/25  16:03    <DIR>          ..  
2018/01/25  16:33                 6 aaa.txt  
2018/01/25  16:04               951 ArgumentCheckTest.class  
2018/01/25  16:04               427 ArgumentCheckTest.java  


という状況にした後でNo.4と同じやり方で実行すると

引数はaaa.txtです。  

となった。




「argsがnullになることがない」ってのがわかっただけでも収穫かもしれんな。