2012-09-10 14 views
8

Jestem trochę zdezorientowany na coś. Napisałem mały fragment kodu.java tablica args w głównym() metoda zamieszania (zerowa kontrola)

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

To jest prosty test. Chociaż nie przekazuję niczego z wiersza poleceń jako argumentu, ale argumenty nadal nie są puste, co oznacza, że ​​JVM inicjuje je do podobnie jak tablica ciągów. Po co konkretny powód tego? Ciekaw jestem, wiedzieć. Wszelkie wskazówki byłyby pomocne. Dzięki, Ben

+0

możliwe duplikat (http://stackoverflow.com/questions/9605532/args-guaranteed-to-be-non-null) http [args gwarantowanych być niezerowe?]: // programiści. stackexchange.com/questions/120355/is-it-better-to-return-null-or-empty-values- from-functions-method s-where-the-ret –

Odpowiedz

6

Kiedy nic nie przechodzą The args nie jest null - jest pusty:

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

Czy to zachowanie określa gdzie w specyfikacji językowej? Wszelkie referencje? – kosa

+0

args jest tablicą i reprezentuje argumenty wiersza poleceń, i jest zawsze inicjowana przez JVM (przy inicjalizacji programu, gdy jest wywoływana główna), więc tablica nigdy nie będzie miała wartości null ... – aleroot

+1

@Nambari Szukałem tego, też, ale nie mogłem znaleźć ostatecznej odpowiedzi: w sekcji 12.1 mówią, że "sposób, w jaki klasa początkowa jest określona na maszynie wirtualnej Java, wykracza poza zakres tej specyfikacji, ale jest typowy w środowiskach użyj wiersza poleceń, aby w pełni kwalifikowana nazwa klasy była określona jako argument wiersza polecenia i dla następujących argumentów wiersza polecenia, które mają być użyte jako łańcuchy znaków jako argument dla metody main ", i nie zapewniają dalsze szczegóły. Myślę więc, że dodanie "null" może być dobrym pomysłem. – dasblinkenlight

0

JVM tworzy i przekazuje wszystkie argumenty jako ciąg [] o nazwie „args ". Dzieje się tak (między innymi), abyśmy nie musieli sprawdzać wartości NULL na obiekcie args. To drobiazg, ale oszczędza on trochę czasu.

+0

Hej, to bardzo pomocne. Dostałem i ciekawość została rozwiązana. Dzięki za tonę. – benz

1

Argument metody main będzie składał się z parametrów ciągu przekazywanych z wiersza poleceń. Jeśli żaden z nich nie przeszedł, nie będzie jeszcze null ale będzie miał rozmiar 0. Spróbuj:

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

Widać, że jest wyjątek:

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

To semantyczne. Jeśli nie ma żadnych argumentów, oznacza to, że lista argumentów jest pusta, nie oznacza to, że pojęcie argumentów nie istnieje. Stąd lista args jest pustą tablicą (tzn. Brak argumentów) zamiast wartości zerowej (tzn. Argumenty nie istnieją).

+0

Dzięki tona privat. Zrozumiałem. To było naprawdę pomocne wyjaśnienie. – benz

0

sprawdź rozmiar tablicy łańcuchowej args, jeśli jest zero, a nie ma w niej nic, a jeśli rozmiar jest większy niż 1, to jest w czymś, spróbuj postawić punkt przerwania (jeśli używasz IDE) lub iteruj po tablicy, aby zobaczyć zawartość tablicy.

1

Twoje sprawdzanie tablicy zerowej nie jest błędem, jeśli nie z powodu faktu, że tablica args przekazana do funkcji main programu Java jest kiedykolwiek inicjalizowana przez samą maszynę JVM, więc tablica nigdy nie będzie miała wartości NULL, może być puste, ale nie puste. JVM gwarantuje, że macierz args zostanie zainicjalizowana. Sprawdzanie wartości zerowej nadal nie jest błędne, ale jest zbędne i nie ma większego sensu, zwłaszcza że nie ma sensu, który mu dałeś (brak argumentów przekazywanych z linii poleceń).

Ponieważ tablica będzie zawsze zainicjowany, można mieć pewność, że będzie nie zerowy i wykonać tylko pusty czek:

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

I można nawet bezpośrednio iterację tablicy bez obawy o NullPointerException:

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

Dzięki, że było to bardziej logiczne wyjaśnienie. – benz

+0

"JVM gwarantuje, że tablica args zostanie zainicjalizowana" Czy możesz podać jakiekolwiek odniesienia do tego? Naprawdę szukamy oficjalnej dokumentacji. – kosa

+0

@Nambari widziałeś kiedykolwiek parametr tablicy args głównej funkcji programu JAva null? Nie ... – aleroot