2012-09-10 19 views
8

Biraz şaşkınım. Küçük bir kod snippet'i yazdım.java args dizisinde main() yöntemi karışıklığı (null check)

import java.util.*; 
class AA 
{ 
    public static void main(String args[]) 
    { 
    if(args == null) 
    { 
      System.out.println("I am null"); 
    } 
    else{ 
      System.out.println(args); 
     } 
} 
} 

Bu basit bir testtir. Ben argüman olarak komut satırı bir şey geçmiyor olsa da, yine de hatalar JVM String dizisi gibi bir şey için başlatır anlamına gelir. Neden bunun arkasında belirli bir sebep var? Ben bilmek merak ediyorum. Herhangi bir işaretçi yardımcı olacaktır. jvm oluşturur

if(args.length == 0) 
{ 
     System.out.println("I am empty"); 
} else{ 
     System.out.println(args); 
} 
+0

olası yinelenen (http://stackoverflow.com/questions/9605532/args-guaranteed-to-be-non-null), http [boş olmayan olması garanti Args?]: // programcılar. stackexchange.com/questions/120355/is-it-better-to-return-null-or-empty-values-from-functions-method s-nerede-the-ret –

cevap

6

şey geçemiyor, argsnull değil ". Bu (diğer nedenlerin yanı sıra) yapılır, böylece args nesnesinde null değerini denetlememiz gerekmez. Bu küçük bir şey ama az miktarda zaman kazandırır.

+2

Bu davranış dil özelliğinde herhangi bir yerde belirtiliyor mu? Herhangi bir referans? – kosa

+0

args bir dizidir ve komut satırı argümanları temsil eder ve şimdiye kadar bu dizi null asla öyle ... – aleroot

+1

@Nambari Bunun arıyordu (ana denir programı başlatma sırasında) JVM tarafından başlatılır, çok ama kesin bir cevap bulamadık: onlar ilk sınıf Java sanal makineye belirtilen kullanılış şekli bu şartnamenin kapsamı dışındadır" demek bölümünde 12.1 yılında, ancak konak ortamlarında, tipik olduğunu bir komut satırı bağımsız olarak belirtilebilir sınıfın tam nitelikli adı, komut hatları kullanmak ve şeritler ana yöntem" değişken olarak sağlanacak şekilde komut satırı bağımsız değişkenleri aşağıdaki için kullanılacak, ve hiçbir sağlamak daha fazla ayrıntı. Bu yüzden bir 'null' eklenmesi iyi bir fikir olabilir sanırım. – dasblinkenlight

0

ve bir dize [] adlı "args olarak tüm bağımsız değişkenler geçirir: bu boş edilir - sayesinde Ben

+0

Hey bu çok yardımcı oldu. Anladım ve merak çözüldü. Bir ton teşekkürler. – benz

1

main yönteminin argümanı, komut satırından iletilen dize parametrelerini içerecektir. hiçbiri geçirilir, hala null olmayacak ama 0 bir boyut Sadece dene olacak: Bir istisnası atılır görebilirsiniz

public static void main(String[] args) { 
    System.out.println(args[0]); 
} 

:

 
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 
4

Bu semantik bu. Eğer argüman yoksa, argüman listeniz boş demektir, argüman kavramı mevcut olmadığı anlamına gelmez. Bu nedenle, args listesi boş bir dizidir (yani argümanlar yok), boş değer (yani argümanlar mevcut değil).

+0

Bir ton özel teşekkürler. Anladım. Gerçekten yardımcı bir açıklamaydı. – benz

0

Args dizgisi dizisinin büyüklüğünü kontrol edin, eğer sıfırdan büyük bir değer var ise ve boyut 1'den büyükse, içinde bir şey varsa, bir kesme noktası koymaya çalışın (IDE kullanıyorsanız) veya dizinin içeriğini görmek için dizi üzerinde yineleyin.

1
bir Java programının main işleve geçirilen args dizi hiç JVM kendisi tarafından başlatılır, böylece dizisi null asla gerçeği olmasaydı boş dizinin İçin kontrol yanlış değil

, onu sadece boş olabilir ama boş olamaz. JVM, args dizisinin başlatılacağını garanti eder. Null hala yanlış değil, ama gereksizdir ve pek bir anlam ifade etmemektedir, özellikle ona verdiğiniz anlam (komut satırında bir argüman geçmemiş) değildir.

dizi daima başlatılır olduğundan, boş değil olacağından emin olun ve sadece boş kontrolü yapabilirsiniz:

if(argsl.length == 0) { 
//Is empty 
} 

Ve hatta doğrudan NullPointerException endişelenmeden dizi yineleme yapabilirsiniz:

arasında
for(String arg : args) { 
    System.out.println(arg); 
} 
+0

Bu daha mantıklı bir açıklama oldu. – benz

+0

"JVM, args dizisinin başlatılacağını garanti eder." Buraya herhangi bir gönderme yapabilir misiniz? Biz gerçekten resmi belgeleri arıyoruz. – kosa

+0

@Nambari, bir JAva programının null işlevinin bir args dizi parametresini gördünüz mü? Ben ... – aleroot

İlgili konular