2009-11-04 44 views
15

私はString [] argsがmainにパラメータとして渡される文字列の配列であることを理解しています。あなたは、パラメータ(あなたが使用していない場合でも)として、それが含まれていませんがJavaでString [] argsが必要なのはなぜですか?

 

class Print { 
    public static void main(String[] args) { 
    System.out.println(args[0]); 
    } 
} 

java Print "Hello, World!" 

は、それが例外をスローします。ではなぜそれが必要なのでしょうか?また、なぜそれはint []またはboolean []でなければできませんか?

答えて

31

コマンドラインがテキストで表されるため、文字列です。そのテキストを整数またはブール値に変換する必要がある場合は、オペレーティングシステムまたはJavaブートストラッパーが、どのようにすべてを解析する必要があるかを正確に把握するにはどうすればよいでしょうか?私は、Java コマンドライン引数と同じ数のパラメータでメインメソッドを探して、Integer.parseIntなどを使用してそれらを解析しようとすると思います...しかし、これはかなり複雑になり、多くの状況ではまだ不十分です。

基本的に、Javaデザイナーは基本的に単一のメソッドシグネチャに固執することを決めました。これはオプションであることを率直に単純化しています。それはしかし可能である - C#では、あなたは最終的に、それは正直に言うと、違いの多くを作成しません

static void Main() 
static void Main(string[] args) 
static int Main() 
static int Main(string[] args) 

のいずれかを有することができます。パラメータを含める必要はありません。

+0

大井、なぜ名前が変わるのですか? – paxdiablo

+0

+1 - 違いはありません。一緒に動いて、ここで何も起こっていません:-) –

+0

@paxdiablo:DevDaysでの私の話のおかげで少し楽しいです。数日または1週間後に元に戻ります。 –

4

Javaランタイムシステムは、mainメソッドにパラメータを渡したいので、1つのString[]タイプのパラメータを持つメソッドを特に探します。そのようなメソッドが存在しない場合は、例外を介して通知されます。

(文字列)コマンドラインパラメータを整数またはブール値として扱う場合は、変換を自分で行う必要があります。これにより、誰かが整数を期待する"ponies"を入力する条件を処理することができます。

+0

なぜですか?あなたが理由を知っているなら、私にここで教えてください。http://stackoverflow.com/questions/33454612/significance-of-string-args-while-writing-main – abhishah901

2

これは言語の設計方法です。 CとC++はどちらも同様の方法でそれを行いますが、Javaの文字列配列に含まれる情報は別々にカウントされます。

は、整数またはブール値をとるように設計されていますが、Javaランタイムにはほとんど効果がない可能性があります。

文字列を使用して、メインプログラム(整数とブール値を含む)にあらゆる種類の情報を送信できます。文字列を渡したい場合(UTF-8などのように手動でエンコードしなければならない人のほうが短く、人に言語を浪費するものではありません)。

それを宣言してください。あなたが望むならば(必要に応じて、あるいは他の署名を許可するために)欲しいならば、是非言語の変更要求を提起してください。

-1

main()関数を実行するコードは、そのシグネチャを非常に具体的に調べているためです。

YourClass.main(new String[] { ... }); 

明らかに、メインが他のものを取る場合、これは失敗します。

0

これは規約です。このメソッドは、コマンドラインインタプリタによって使用され、それがそれを期待する方法です。また、コンパイラはこの特定の形式のシグニチャも期待していますが、パラメータを省略するとコンパイルできません。たとえば、

+0

なぜですか?あなたが理由を知っていれば、私にここで教えてください - http://stackoverflow.com/questions/33454612/significance-of-string-args-while-writing-main – abhishah901

+0

インタプリタ*は署名を期待しています。コンパイラはありません。 – abhishah901

0

文字列[]パラメータはコマンドライン引数を保存するために使用されます。さらに、string []なしでmainメソッドを呼び出すと、単純にオーバーロードになり、JVMはそのメソッドを呼び出さなくなります。このシグネチャのメインメソッドをスキップすると、JVMは例外をスローします

+0

最初のコマンドライン引数は、Javaのクラス名ではありません。コマンドライン引数を渡さない場合、つまりjava yourClassNameというだけであれば、classNameをString配列に入れません。 C/C++では、実行可能ファイル名が最初の引数です。 – Vivek

関連する問題