Java入門 / Java基本

【Java入門】第5回 mainメソッドとコマンドライン引数

2024.05.24

HelloWorldでは、コマンドプロンプト上でソースファイル(またはクラス)のみを指定して実行しましたが、プログラムの実行時に任意の値(パラメータ)を引き渡して実行することも可能です。

mainメソッドについて

javaでは一連の処理をまとめて記述し、名前を付けた(定義した)ものをメソッドと呼びます。
定義された処理を実行する際は、この名前(メソッド名)を記述することで処理を実行できます。
(HelloWorldで文字列を出力するのに利用した「println」もメソッドの1つです)

メソッドの中でも、特に「main」と名付けられたメソッドは特別な存在で、javaのプログラムの実行時には、必ずmainメソッドが最初に実行されるようになっています。

前回の記事で実行した「HelloWorld.java」のプログラムソースにも、このmainメソッドが準備されていました。

以下のようなmainメソッドがないソースファイルやクラスを指定しても、実行時には以下のとおりエラーとなります。
試しに「C:\java\NoMain\NoMain.java」に保存して実行してみましょう。

Java
/**
 * mainメソッドがないクラス。実行時にエラーになります。
 */
public class NoMain {
    public static void mainless(String[] args) {
        // エラーになるためこのメッセージは表示されない
        System.out.println("このクラスにはmainメソッドがありません。");
    }
}


◆実行結果:


エラーとなり、「このクラスにはmainメソッドがありません。」の文字列は出力されていません。

メソッドと引数

javaのメソッドの実行時には、実行するために必要な値(パラメータ)を引き渡すことができます。このパラメータをメソッドの「引数」と呼びます。

また、Javaのプログラムの実行時には、コマンドプロンプト上に入力したパラメータをmainメソッドへ引数として渡すことが可能です。この「プログラム実行時に、mainメソッドへ引き渡すパラメータ」を特に「コマンドライン引数」や「起動パラメータ」と呼びます。

コマンドライン引数の利用

コマンドライン引数を指定して実行

それでは、コマンドライン引数を指定してプログラムを実行してみます。

まず、以下のサンプルプログラムを準備します。
ここでは「C:\java\HelloAnyone\HelloAnyone.java」に保存してみます。

Java
/**
 * コマンドライン引数の利用サンプルプログラム
 */
class HelloAnyone {
    public static void main(String[] args) {
        // 「こんにちは、〇〇(パラメータ値)さん。」と標準出力します
        System.out.println("こんにちは、" + args[0] + "さん。"); 
    }
}


コマンドライン引数を指定する場合は、実行コマンド(java ファイルorクラス名)の後に、半角スペースで区切って入力します。

◆実行結果:

コマンドライン引数に指定した文字列「Programmer」が出力されているのが分かります。

複数個のコマンドライン引数を指定する

コマンドライン引数には、複数個のパラメータを引き渡すことも可能です。複数個のパラメータを指定する場合は、それぞれ半角スペースで区切って指定します。

下記のサンプルプログラムは、渡されたコマンドライン引数を「,(カンマ)」でつないで出力します。

Java
import java.util.Arrays;
import java.util.stream.Collectors;
/**
 * 実行時に指定したコマンドライン引数をカンマで連結して出力する
 */
public class JoinArgs {
    public static void main(String[] args) {
        System.out.println(
            Arrays.asList(args).stream().collect(Collectors.joining(",")));
    }
}


◆実行結果(C:\java\JoinArgs\JoinArgs.java に保存した場合):

コマンドライン引数に指定した2つのパラメータ「candy」と「chocolate」がカンマでつないで出力されています。

コマンドライン引数に「半角スペース」を含む文字列を指定したい場合は、「"(ダブルクォーテーション)」で囲んで指定します。

◆実行結果①(文字列「apple pie」をダブルクォーテーションで囲んだ場合):


◆実行結果②(文字列「apple pie」をダブルクォーテーションで囲まない場合):


ダブルクォーテーションで囲まない場合は「apple」と「pie」の2つのパラメータとしてみなされてしまいます。

引数無しのmainメソッド(java21)について

※以下はJava21で追加された機能についての記事ですが、現時点ではプレビュー機能(試用のための機能)として準備されています。

このため今は利用する必要はありませんが、Javaプログラミングの敷居を下げるための一環としての機能追加ですので、ここでも説明してみたいと思います。

Java 21 では、mainメソッドの簡略化を図るプレビュー機能が準備されました。
この機能を利用すると、mainメソッドについて以下のような記述が可能になります。

  • クラスの定義が不要(自動的に無名のクラスが準備される)
  • 引数の指定が不要
  • 「public static」の指定が不要

上記のとおり「クラス」「引数」「public static の指定」を全て省略すると、以下のようなソースコードになります。

Java
/**
 * クラス名もstaticもfinalも引数args[]もなくても実行できます
 */
void main() {
    System.out.println("Hello No Class World!");
}


このソースコードを「C:\java\NoClass\NoClass.java」に保存して実行してみます。
プレビュー機能を利用するためには、コマンド実行時にオプション(--source 21 --enable-preview の部分)を指定します。

実行結果:


また、クラスを定義した場合でも、同様に引数やpublic staticの指定を省略することができます。
この場合は、以下のどちらでも実行可能となっています。(オプションの指定は必要です)
・コンパイルしてクラス名を指定して実行
・コンパイルせずにソースファイル名を指定して実行

以下のソースコードを「C:\java\NoArgsMain\NoArgsMain.java」に保存して実行してみます。

Java
/**
 * staticもfinalも引数args[]もなくても実行できます
 */
class NoArgsMain {
    void main() {
        System.out.println("Hello No static, public, args World!");
    }
}


実行結果(コンパイルして実行):


実行結果(ソースファイルを指定して実行):


※ソースファイルを指定して実行の場合は、ファイル名が「.java」以外の拡張子でも実行できます。

株式会社GSI 採用サイト