Java: Überprüfen Sie, ob die Befehlszeilenargumente null sind

89

Ich möchte eine Fehlerprüfung für meine Befehlszeilenargumente durchführen

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

Dies gibt jedoch eine Array-Ausnahme außerhalb der Grenzen zurück, was sinnvoll ist. Ich suche nur nach der richtigen Verwendung.

Bobby S.
quelle

Antworten:

159

Die Argumente können niemals sein null. Sie werden einfach nicht existieren.

Mit anderen Worten, Sie müssen die Länge Ihrer Argumente überprüfen.

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
quelle
18

@ jjnguys Antwort ist in den meisten Fällen richtig. Sie werden niemals einen nullString im Argumentarray (oder einem nullArray) sehen, wenn der mainAufruf durch Ausführen der Anwendung auf normale Weise über die Befehlszeile ausgeführt wird.

Wenn jedoch ein anderer Teil der Anwendung eine mainMethode aufruft , ist es denkbar, dass sie ein nullArgument oder ein nullArgumentarray übergibt.

(2) Dies ist jedoch eindeutig ein äußerst ungewöhnlicher Anwendungsfall, und es handelt sich um eine ungeheure Verletzung des implizierten Vertrags für eine mainEinstiegspunktmethode. Daher denke ich nicht, dass Sie sich die Mühe machen sollten, nach nullArgumentwerten in zu suchen main. In dem unwahrscheinlichen Fall, dass sie auftreten, ist es akzeptabel, dass der aufrufende Code a erhält NullPointerException. Immerhin ist es ein Fehler im Anrufer, den Vertrag zu verletzen.

Stephen C.
quelle
11

Um diesen Punkt zu erweitern:

Es ist möglich, dass die args-Variable selbst null ist, jedoch nicht über die normale Ausführung. Die normale Ausführung wird java.exeals Einstiegspunkt über die Befehlszeile verwendet. Ich habe jedoch einige Programme gesehen, die kompilierten C++Code mit JNI verwenden jvm.dll, um die Datei java.exe vollständig zu umgehen. In diesem Fall ist es möglich, NULLan die Hauptmethode zu übergeben. In diesem Fall sind args null.

Ich empfehle immer zu überprüfen if ((args == null) || (args.length == 0))oder if ((args != null) && (args.length > 0))je nach Bedarf.

Sean Crouse
quelle
0

Sie sollten nachsehen (args == null || args.length == 0). Obwohl die nullPrüfung nicht wirklich benötigt wird, ist sie eine gute Praxis.

fastcodejava
quelle
1
Unnötige Überprüfungen sind KEINE gute Praxis. Die nullÜberprüfung ist nicht lengtherforderlich , aber Sie haben Recht, dass die Überprüfung erforderlich ist,
Stephen C
-10

Wenn Sie kein Argument übergeben, wird args auch in diesem Fall initialisiert, jedoch ohne Element / Element. Versuchen Sie Folgendes, Sie erhalten den gleichen Effekt :

 
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
quelle
1
Das ist völlig falsch. Wenn eine Anwendung ohne Befehlszeilenargumente gestartet wird, wird die mainMethode mit einem argsArray aufgerufen, dessen Länge Null ist.
Stephen C
@Stephen Ein Array ohne Element hat eine Länge von Null. Was ist dann falsch an meiner Antwort?
Puspendu Banerjee
@Puspendu - was falsch ist, ist, dass dummy[0]ein Array-Index eine Ausnahme außerhalb der Grenzen auslöst !! Das Gleiche gilt, wenn Sie das Programm (zurück) auf Testen ändern args[0]und es ohne Argumente ausführen.
Stephen C
1
Okay, ich verstehe jetzt. Es hätte geholfen, wenn Sie Ihren ersten Satz nicht falsch geschrieben hätten. Wie geschrieben ist es unverständlich. Ich stelle fest, dass Sie es in Ihrem letzten Kommentar leise korrigiert haben. Hinterhältig.
Stephen C
1
"Ich habe keine Lösung angegeben, sondern versucht, das Problem zu beschreiben." Dann poste keine Antwort. Einen Kommentar posten.
Stealth Rabbi