Java: Periksa apakah argumen baris perintah adalah null

89

Saya mencari untuk melakukan pemeriksaan kesalahan untuk argumen baris perintah saya

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

Namun, ini mengembalikan pengecualian larik di luar batas, yang masuk akal. Saya hanya mencari penggunaan yang tepat.

Bobby S.
sumber

Jawaban:

159

Argumen tidak akan pernah bisa null. Mereka tidak akan ada.

Dengan kata lain, yang perlu Anda lakukan adalah memeriksa panjang argumen Anda.

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

Jawaban @ jjnguy benar dalam banyak situasi. Anda tidak akan pernah melihat nullString dalam array argumen (atau nullarray) jika maindipanggil dengan menjalankan aplikasi dijalankan dari baris perintah dengan cara biasa.

Namun, jika beberapa bagian lain dari aplikasi memanggil sebuah mainmetode, bisa dibayangkan bahwa itu mungkin melewatkan nullargumen atau nullarray argumen.

Namun (2), ini jelas merupakan kasus penggunaan yang sangat tidak biasa, dan ini merupakan pelanggaran berat terhadap kontrak tersirat untuk mainmetode titik masuk. Oleh karena itu, saya rasa Anda tidak perlu repot-repot memeriksa nullnilai argumen di main. Dalam hal yang tidak mungkin terjadi, itu dapat diterima untuk kode panggilan untuk mendapatkan NullPointerException. Bagaimanapun, itu adalah bug di penelepon untuk melanggar kontrak.

Stephen C
sumber
11

Untuk memperluas poin ini:

Ada kemungkinan bahwa variabel args itu sendiri akan menjadi nol, tetapi tidak melalui eksekusi normal. Eksekusi normal akan digunakan java.exesebagai titik masuk dari baris perintah. Namun, saya telah melihat beberapa program yang menggunakan C++kode yang dikompilasi dengan JNI untuk menggunakan jvm.dll, melewati java.exe seluruhnya. Dalam hal ini, dimungkinkan untuk meneruskan NULLke metode utama, dalam hal ini args akan menjadi nol.

Saya sarankan untuk selalu mengecek if ((args == null) || (args.length == 0)), atau if ((args != null) && (args.length > 0))tergantung kebutuhan Anda.

Sean Crouse
sumber
0

Anda harus memeriksanya (args == null || args.length == 0). Meskipun nullpemeriksaan tidak terlalu diperlukan, ini adalah praktik yang baik.

fastcodejava.dll
sumber
1
Pemeriksaan yang tidak perlu BUKAN praktik yang baik. The nullcek tidak perlu, tetapi Anda benar bahwa lengthcek diperlukan,
Stephen C
0

jika saya ingin memeriksa apakah ada posisi tertentu dari argumen baris perintah yang dilewatkan atau tidak, lalu bagaimana cara memeriksa? seperti misalnya dalam beberapa skenario 2 baris perintah args akan dilewatkan dan dalam beberapa hanya satu yang akan dilewatkan lalu bagaimana cara memeriksa apakah baris commnad specfic dilewati atau tidak?

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

Jadi pada kode di atas jika args [1] tidak dilewatkan maka saya mendapatkan java.lang.ArrayIndexOutOfBoundsException:

jadi bagaimana cara saya menangani ini di mana saya dapat memeriksa apakah argumen kedua berlalu atau tidak dan jika lulus kemudian masukkan. membutuhkan bantuan secepatnya.

pengguna4888455
sumber
Tolong buat ini jadi pertanyaan. Karena tidak menjawab pertanyaan, itu tidak termasuk di sini. Dengan mengajukan pertanyaan, Anda memiliki peluang yang jauh lebih baik untuk mendapatkan jawaban.
AlexH
-10

Jika Anda tidak meneruskan argumen apa pun, bahkan dalam kasus itu args diinisialisasi tetapi tanpa item / elemen apa pun. Coba yang berikut ini, Anda akan mendapatkan efek yang sama :

 
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
sumber
1
Ini sama sekali tidak benar. Jika aplikasi diluncurkan tanpa argumen baris perintah, mainmetode tersebut akan dipanggil dengan argslarik yang panjangnya nol.
Stephen C
@Stephen Sebuah array tanpa elemen apapun di dalamnya, memiliki panjang nol. Lalu apa yang salah dengan jawabanku?
Puspendu Banerjee
@Puspendu - apa yang salah adalah yang dummy[0]melempar indeks array keluar dari batas pengecualian !! Ditto jika Anda mengubah program (kembali) ke pengujian args[0]dan menjalankannya tanpa argumen.
Stephen C
1
OK - Saya mengerti sekarang. Akan sangat membantu jika Anda tidak salah mengetik kalimat pertama Anda. Seperti yang tertulis, itu tidak dapat dipahami. Saya perhatikan bahwa Anda diam-diam mengoreksinya di komentar terakhir Anda. Licik.
Stephen C
1
"Saya belum memberikan solusi apa pun, melainkan saya mencoba menjelaskan masalahnya". Maka jangan posting jawaban. Tulis komentar.
Stealth Rabbi