Запуск программ Java и обработка аргументов командной строки

Чтобы запустить Java программу следует указать имя класса Java в командной строке. Например, допустим, имеется такой класс:

    public class MyProgram {
        ...

        // Точка входа в мою программу.
        public static void main(String[] args) {
            ...  // Код моей программы.
        }
    }

(Этот код должен храниться в файле MyProgram.java, и компилироваться по команде

    java MyProgram 1234 www.caltech.edu "olive festival"

Для запуска этого Java кода, надо вызвать виртуальную машину (Java Virtual Machine/JVM) с командой:

    java MyProgram

JVM загрузит MyProgram.class, и начнет исполнение вашей программы, начиная с метода main.  Это точка входа в программу.

Метод main должен быть объявлен по определенным правилам, для того чтобы JVM смогла отличить его от других методов класса. Он должен иметь модификаторы public и static,иметь один аргумент типа String[] и не возвращать значения (void). Если в классе метод main в точности соответствующий этому описанию, при попытке запуска программы вам вернется сообщение об ошибке:

    java MyProgram

    Exception in thread "main" java.lang.NoSuchMethodError: main

Если вы видите такую ошибку, проверьте правильно ли вы объявили в тексте программы метод  main. В нашем примере все сделано правильно.

Аргументы командной строки

Часто, в программе требуется обработать аргументы, указанные в командной строке. Например, программу можно запустить так:

    java MyProgram 1234 www.caltech.edu "olive festival"

Программе нужно как то получить доступ к значениям указанным в командной строке. Это можно сделать через аргумент типа String[], который передается методу main. Заметим, что это массив строк. Каждый элемент в массиве содержит одно из значений указанных в командной строке.

Для приведенного выше примера, массив args будет содержать следующие значения:

args.length = 3
args[0] = "1234"
args[1] = "www.caltech.edu"
args[2] = "olive festival"

Аргументы Java программы разделяются пробелами или символами табуляции, кроме случая, кода они заключены в двойные кавычки. В нашем примере, первые два аргумента: "1234" и "www.caltech.edu", так как Java VM разделяет их, с помощью пробела. Третий аргумент, "olive festival", не разбивается на отельные аргументы, так как он заключен в двойные кавычки.

Учтите, что пробелы, расположенные между аргументами, а также в начале и конце списка аргументов, удаляются и не присутствуют в массиве args. В массив также не попадают двойные кавычки, в которые заключены аргументы.

(Если вы программировали на C или C++,  вы должны заметить разницу между тем как аргументы передаются программам на C и C++,  и как они передаются программам на языке Java. В C и C++, первый элемент массива argv[0] это имя самой программы, а argv[1] первый аргумент командной строки программы. В Java, args[0] это первый аргумент командной строки программы а имя программы отсутствует в аргументах.)

Числа в командной строке

Если программа на языке Java получает числовые параметры через командную строку, она должна явно преобразовать строковое представление числа в значение числового типа. Вернемся к нашему примеру. В командной строке, первый аргумент "1234", имеет тип String. Его требуется преобразовать в целое число. Для выполнения таких преобразований используют класса из пакета java.lang . Например, для преобразования args[0] в целое число, можно сделать так:

    public static void main(String[] args) {
        int num = 0;

        ...

        try {
            // Преобразовать строку в целое.
            num = Integer.parseInt(args[0]);
        }
        catch (NumberFormatException nfe) {
            // Первый аргумент командной строки не целое число.  Выводим
            // сообщение об ошибке и завершаем работу.
            System.out.println("Первый аргумент должен быть целым числом.");
            System.exit(1);
        }

        ...  // Код использующий значения аргументов командной строки.
    }

К этому коду есть несколько важных замечаний:

Переменная должна быть объявлена перед блоком try/catch потому что она используется после того как блок завершит работу; если объявить ее внутри блока, она будет доступна только внутри блока.

Переменная должна быть проинициализирована перед блоком try/catch потому что, если этого не сделать, компилятор Java выдаст сообщение о "не инициализированной переменной " во время компиляции.

Ниже приведен не полных список примитивных типов данных и функций которые можно использовать для преобразования аргументов командной строки. Эти классы находятся в пакете java.lang, и следовательно доступны без добавления каких либо директив import к программе. Функции преобразования статические и это значит, что вам не надо создавать какие либо новые объекты, прежде чем вызывать эти функции.

Примитивный тип данных

Функция преобразования

boolean

boolean Boolean.parseBoolean(String)

Int

int Integer.parseInt(String)

Long

long Long.parseLong(String)

float

float Float.parseFloat(String)

double

double Double.parseDouble(String)