Javaで初めてつまずいたところ

Javaで初めてつまづいたのは、インストールでも環境変数の設定でもない。これらはどんな入門書でも載っているものであって、そのとおりに進めればなんとかなった*1。では何につまずいたかというと、argsである。

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

入門書の最初によくあるようなプログラムだけど、これだけのプログラムでも初心者にとっては呪文のようなものだ。で、入門書には初心者のつまずきそうな部分が色々と説明されている。たとえば、

  • public class HelloWorldと書いたならファイル名はHelloWorldにしないといけない
  • Javaではmainメソッド*2から処理が始まるから、ここにやりたいことを書けばOK
  • System.out.printlnというのは、文字を出力するために使う
  • public static void mainとか、public class 〜というのは、今はおまじないと思っておけ

とかいろいろ。でも、おまじないという場合を除いて、argsについての説明は、だいたいどんな本でも説明されることがない。例えば、Stringの部分が分からなくても、索引でStringを引けば分るし、ちょっと読み進めればというのが配列を意味するということもわかる。publicだってclassだってstaticだってvoidだって、後で説明がある。

なのに、argsはないのである。冗談ではなく、初めてつまずいたのはここだった。
学校でC++をやっていたものの、まだ関数まで進んでいないときで、さらにコマンドライン引数をとるようなプログラムも高専5年間を通じて授業では一度も触れなかったため、C++でのHello, World!は、

#include <iostream.h>

int main(void)
{
    cout << "Hello, World!" << endl;
    return 0;
}

だった*3。学校に入る前に自分ですこしJavaScriptをやっていたのだが、JavaScriptにmainはなく、関数にしたって

function hoge(piyo) {
    ...
}

と、ぜんぜん違う記述なのである*4。というか、そもそもJavaScriptの関数でさえ全然理解していなかった。
そんなこんなが重なって、見事にargsでつまずいたまま、おまじないだと思っておいた。


で、そのまま読みすすめ、とうとうメソッドの説明に来たのだが、ここでもargsについては分らないままだった。というのも、「引数の名前は何でもいい」はずなのに、どこを見ても*5、mainメソッドの引数はargsしかないのである!
何とも間抜けな話*6だけど、謎が晴れたのはちょっとしたタイプミスから。

public class Hoge {
    public static void main(String[] arg) {
    }
}

だったかなんだったか、とにかく、argsではない名前でコンパイルしてしまい、あぁ、エラーになっちゃう、と思ったのだが、なんとエラーにならなかった!
これによって、長かったargsの謎が晴れたのだが、あの時はえらく感動したよなぁ。懐かしい。

#結局、何が言いたかったんだ・・・?

*1:意味は分らなかったが

*2:メソッドという名前は出したり出さなかったり

*3:そういえば#includeは「おまじない」以上の説明はなかったなぁ

*4:少なくとも当時の自分にとってはぜんぜん違うものに見えた

*5:書籍、ネット含み色々と見た

*6:頭が柔らかければ(?)この時点でargs以外の名前を試したんだろうなぁ