Java: Sprawdź, czy argumenty wiersza poleceń są puste

89

Chcę sprawdzić błędy w moich argumentach wiersza poleceń

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

Jednak zwraca to tablicę wyjątku poza granicami, co ma sens. Szukam tylko odpowiedniego użycia.

Bobby S.
źródło

Odpowiedzi:

159

Argumenty nigdy nie mogą być null. Po prostu nie będą istnieć.

Innymi słowy, musisz sprawdzić długość swoich argumentów.

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
źródło
18

Odpowiedź @ jjnguy jest w większości przypadków poprawna. Nigdy nie zobaczysz ciągu nullw tablicy argumentów (lub nulltablicy), jeśli mainjest wywoływana przez uruchomienie aplikacji jest uruchamiana z wiersza poleceń w normalny sposób.

Jeśli jednak jakaś inna część aplikacji wywoła mainmetodę, można sobie wyobrazić, że może przekazać nullargument lub nulltablicę argumentów.

Jednak (2) jest to wyraźnie bardzo nietypowy przypadek użycia i jest to rażące naruszenie dorozumianej umowy dotyczącej mainmetody punktu wejścia. Dlatego uważam, że nie powinieneś zawracać sobie głowy sprawdzaniem nullwartości argumentów w main. W mało prawdopodobnym przypadku, gdy wystąpią, dopuszczalne jest, aby kod wywołujący otrzymał rozszerzenie NullPointerException. W końcu błędem dzwoniącego jest naruszenie umowy.

Stephen C.
źródło
11

Aby rozwinąć ten punkt:

Możliwe, że sama zmienna args będzie miała wartość NULL, ale nie przy normalnym wykonaniu. Normalne wykonanie będzie używane java.exejako punkt wejścia z wiersza poleceń. Jednak widziałem niektóre programy, które używają skompilowanego C++kodu z JNI do używania jvm.dll, całkowicie omijając java.exe. W takim przypadku można przejść NULLdo metody głównej, w którym to przypadku argumenty będą miały wartość null.

Zalecam zawsze sprawdzić if ((args == null) || (args.length == 0))lub w if ((args != null) && (args.length > 0))zależności od potrzeb.

Sean Crouse
źródło
0

Powinieneś sprawdzić (args == null || args.length == 0). Chociaż nullsprawdzenie nie jest naprawdę potrzebne, jest to dobra praktyka.

fastcodejava
źródło
1
Niepotrzebne kontrole NIE są dobrą praktyką. nullWyboru jest zbędne, ale masz rację, że lengthkontrola jest konieczna,
Stephen C
0

jeśli chcę sprawdzić, czy jakaś konkretna pozycja argumentu wiersza poleceń została przekazana, czy nie, to jak to sprawdzić? tak jak na przykład w niektórych scenariuszach 2 argumenty wiersza poleceń zostaną przekazane, aw niektórych tylko jeden, to jak sprawdza, czy określona linia komend została przekazana, czy nie?

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

Więc w powyższym kodzie, jeśli argumenty [1] nie zostaną przekazane, otrzymam java.lang.ArrayIndexOutOfBoundsException:

więc jak sobie z tym poradzić, gdzie mogę sprawdzić, czy drugi argument został przekazany, czy nie, a jeśli został zaliczony, wprowadź go. potrzebuję pomocy jak najszybciej.

user4888455
źródło
Niech to będzie pytanie. Ponieważ nie odpowiada na pytanie, nie należy tutaj. Zamiast tego zadając pytanie, masz znacznie większą szansę na uzyskanie odpowiedzi.
AlexH
-10

Jeśli nie przekażesz żadnego argumentu, nawet w tym przypadku argumenty zostaną zainicjalizowane, ale bez żadnego elementu / elementu. Spróbuj tego, a uzyskasz ten sam efekt :

 
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
źródło
1
To jest całkowicie błędne. Jeśli aplikacja zostanie uruchomiona bez argumentów wiersza poleceń, mainmetoda zostanie wywołana z argstablicą o długości równej zero.
Stephen C
@Stephen Tablica bez żadnego elementu wewnątrz, ma zerową długość. Więc co jest nie tak w mojej odpowiedzi?
Puspendu Banerjee
@Puspendu - nie tak jest to, że dummy[0]wyrzuca indeks tablicy poza granicami wyjątku !! Podobnie, jeśli zmienisz program (z powrotem) na testowanie args[0]i uruchomisz go bez argumentów.
Stephen C
1
OK - teraz rozumiem. Pomogłoby to, gdybyś nie pomylił się w pierwszym zdaniu. Jak napisano, jest niezrozumiały. Zauważam, że po cichu poprawiłeś to w swoim ostatnim komentarzu. Podstępny.
Stephen C
1
„Nie podałem żadnego rozwiązania, raczej próbowałem opisać problem”. Więc nie publikuj odpowiedzi. Zostaw komentarz.
Stealth Rabbi