Java: проверьте, являются ли аргументы командной строки пустыми

89

Я хочу выполнить некоторую проверку ошибок для аргументов командной строки

public static void main(String[] args)
{
    if(args[0] == null)
    {
        System.out.println("Proper Usage is: java program filename");
        System.exit(0);
    }
}

Однако это возвращает исключение массива вне границ, что имеет смысл. Я просто ищу правильное использование.

Бобби С
источник

Ответы:

159

Аргументов быть не может null. Их просто не будет.

Другими словами, что вам нужно сделать, это проверить длину ваших аргументов.

public static void main(String[] args)
{
    // Check how many arguments were passed in
    if(args.length == 0)
    {
        System.out.println("Proper Usage is: java program filename");
        System.exit(0);
    }
}
jjnguy
источник
18

Ответ @jjnguy верен в большинстве случаев. Вы никогда не увидите nullString в массиве аргументов (или nullмассиве), если оно mainвызывается запуском, приложение запускается из командной строки обычным способом.

Однако, если какая-то другая часть приложения вызывает mainметод, вполне возможно, что она может передать nullаргумент или nullмассив аргументов.

Однако (2) это явно очень необычный вариант использования, и это вопиющее нарушение подразумеваемого контракта для mainметода точки входа. Поэтому я не думаю, что вам следует беспокоиться о проверке nullзначений аргументов в main. В том маловероятном случае, если они все же происходят, вызывающий код может получить файл NullPointerException. Ведь это баг в звонилке нарушать договор.

Стивен С
источник
11

Чтобы расширить этот момент:

Возможно, что сама переменная args будет иметь значение null, но не при обычном выполнении. Обычное выполнение будет использоваться java.exeв качестве точки входа из командной строки. Однако я видел некоторые программы, которые используют скомпилированный C++код с JNI для использования jvm.dll, полностью обходя java.exe. В этом случае можно перейти NULLк основному методу, и в этом случае args будет нулевым.

Я рекомендую всегда проверять if ((args == null) || (args.length == 0))или в if ((args != null) && (args.length > 0))зависимости от ваших потребностей.

Шон Кроуз
источник
0

Вы должны проверить наличие (args == null || args.length == 0). Хотя nullпроверка на самом деле не нужна, это хорошая практика.

fastcodejava
источник
1
Ненужные проверки НЕ являются хорошей практикой. nullПроверка не нужна, но вы правы , что lengthпроверка необходима,
Стивен C
0

если я хочу проверить, передана ли какая-либо конкретная позиция аргумента командной строки или нет, то как это проверить? например, в некоторых сценариях будут переданы 2 аргумента командной строки, а в некоторых будет передан только один, тогда как он проверяет, передана ли конкретная командная строка или нет?

public class check {

public static void main(String[] args) {
if(args[0].length()!=0)
{
System.out.println("entered first if");
}
if(args[0].length()!=0 && args[1].length()!=0)
{
System.out.println("entered second if");
}
}
}

Итак, в приведенном выше коде, если args [1] не передан, я получаю исключение java.lang.ArrayIndexOutOfBoundsException:

Итак, как мне решить эту проблему, где я могу проверить, прошел ли второй аргумент или нет, и если он прошел, введите его. нужна помощь как можно скорее.

user4888455
источник
Пожалуйста, задайте вопрос. Поскольку он не отвечает на вопрос, ему здесь не место. Если вместо этого задать вопрос, у вас будет гораздо больше шансов получить ответ.
AlexH
-10

Если вы не передаете аргумент, то даже в этом случае args инициализируется, но без какого-либо элемента / элемента. Попробуйте следующий, вы получите тот же эффект :

 
public static void main(String[] args) throws InterruptedException {
        String [] dummy= new String [] {};
        if(dummy[0] == null)
        {
            System.out.println("Proper Usage is: java program filename");
            System.exit(0);
        }

    }

Puspendu Banerjee
источник
1
Это совершенно неверно. Если приложение запускается без аргументов командной строки, mainметод будет вызываться с argsмассивом нулевой длины.
Stephen C
@Stephen Массив без каких-либо элементов внутри имеет нулевую длину. Тогда что не так с моим ответом?
Puspendu Banerjee
@Puspendu - что не так, это то, что dummy[0]выдает исключение индекса массива за пределы !! То же самое, если вы измените программу (обратно) на тестирование args[0]и запустите ее без аргументов.
Stephen C
1
Хорошо, сейчас я понимаю. Было бы неплохо, если бы вы не ошиблись в первом предложении. Как написано неразборчиво. Замечу, что вы незаметно поправили это в своем последнем комментарии. Подлый.
Stephen C
1
«Я не дал никакого решения, я попытался описать проблему». Тогда не отправляйте ответ. Оставить комментарий.
Stealth Rabbi