Почему мы не получаем ошибку, если не передаем аргументы командной строки? - PullRequest
5 голосов
/ 06 сентября 2011

Мы можем дать параметр args[] методу main() или отказаться от него. Но если бы мы вызывали любой другой параметризованный метод без передачи достаточного количества аргументов, это дало бы нам ошибку.

Почему это не так с методом main(String[] args)?

Ответы [ 5 ]

10 голосов
/ 06 сентября 2011
 public static void main(String[] args)

main всегда получает свой параметр, который является массивом String.Если вы не передадите аргументы командной строки, args будет пустым, но он все еще там.

4 голосов
/ 06 сентября 2011

Массив String всегда передается, даже если параметры командной строки отсутствуют.В этой ситуации длина массива равна 0, что вы можете проверить сами с помощью

public static void main(String[] args) {
   if (args.length == 0) {
      System.out.println("no parameters were passed");
   }
}
2 голосов
/ 06 сентября 2011

Как видите, main исключает один аргумент функции - массив строк. JVM заботится о передаче любых аргументов командной строки в виде массива строк в основную функцию. Если аргументы не заданы, передается пустой массив - но он все еще там.

Вы могли бы также иметь свою собственную функцию, определенную следующим образом:

void myMain(String args[]) {
   for(int i = 0; i < args.length; i++) {
       System.out.println(args[i]);
   }
}

Затем вы можете вызвать эту функцию, эмулируя передачу трех аргументов командной строки:

 String a[] = {"foo", "bar", "bah"};
 myMain(a);

Или вы можете эмулировать ситуацию, когда аргументы командной строки не указываются:

String a[] = {};
myMain(a);

Вы также можете передать args из реального главного в вашу функцию, и она будет работать независимо от того, были ли заданы какие-либо параметры:

public static void main(String[] args) {
    myMain(args);
}

Обратите внимание, что в myMain нет проверки на нулевой указатель, поэтому, если вы передадите ему null, он выдаст NPE.

1 голос
/ 06 сентября 2011

Java вызывает сам метод main с аргументами, поэтому в нем нет ошибок, даже если мы "вызываем" без аргументов.

1 голос
/ 06 сентября 2011

Потому что Main является особенным и автоматически принимает пустую String array вместо ничего не дается. Как то точно описывает вызов main() без аргументов. Система обеспечивает это для удобства.

...