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.

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

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.


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.


0

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


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.


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

    }


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.