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);
    }
}

18

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

Однак, якщо якась інша частина програми викликає mainметод, можливо, він може передавати nullаргумент або nullмасив аргументів.

Однак (2), це явно вкрай незвичний випадок використання, і це грубе порушення передбачуваного контракту щодо mainметоду входу. Тому я не думаю, що вам слід турбуватися про перевірку nullзначень аргументів у main. У малоймовірному випадку, коли вони все-таки трапляються, прийнятним є отримання телефонного коду NullPointerException. Зрештою, це помилка в тому, хто телефонує, порушуючи контракт.


11

Щоб розширити цей пункт:

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

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


0

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


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:

так як мені вирішити це питання, де я можу перевірити, чи передано другу аргументацію чи ні, а якщо прийнято, то введіть її. потрібна допомога якомога швидше.


Будь ласка, поставте це питання. Оскільки воно не відповідає на запитання, воно тут не належить. Задавши запитання, ви набагато більше шансів отримати відповідь.
AlexH,

-10

Якщо ви не передасте жодного аргументу, навіть у такому випадку аргументи ініціюються, але без будь-якого елемента / елемента. Спробуйте наступний, ви отримаєте той самий ефект :

 
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);
        }

    }


1
Це абсолютно неправильно. Якщо додаток запускається без аргументів командного рядка, mainметод буде викликаний із argsмасивом, довжина якого дорівнює нулю.
Stephen C

@Stephen Масив без жодного елемента всередині має нульову довжину. Тоді що не так у моїй відповіді?
Пуспенду Банерджі

@Puspendu - неправильно те, що dummy[0]викидає індекс масиву за межі виключення !! Так само, якщо ви зміните програму (назад) на тестування args[0]та запустите її без аргументів.
Stephen C

1
Добре - я зараз розумію. Це допомогло б, якби ви не ввели неправильно своє перше речення. Як написано, це незрозуміло. Зазначу, що ти тихо виправив це у своєму останньому коментарі. Підлий.
Stephen C

1
"Я не дав жодного рішення, а намагався описати проблему". Тоді не розміщуйте відповідь. Опублікуйте коментар.
Stealth Rabbi
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.