2013-06-10 29 views
10

Jest kilka Java system properties, między innymi takie jak java.home i path.separator, user.home. The spec nie wspomina żadnych formalnych obietnic dotyczących istnienia tych wartości.Czy właściwości systemu Java zawsze mają wartość inną niż null?

Szczególnie interesuje mnie user.home. Czy zawsze wskazuje na istniejącą ścieżkę?

+0

Myślę, że to są klucze – anshulkatta

+0

@anshulkatta; Domyślam się, że klucze zawsze istnieją - ale pytanie brzmi, czy zawsze wskazują na coś (przy zdrowych zmysłach?). – miku

+0

Klucze @miku istnieją tylko wtedy, gdy jest ich wartość, sprawdź moją odpowiedź poniżej: – DevZer0

Odpowiedz

4

myślę, że można bezpiecznie założyć, że wszystkie właściwości w tym wykazie jest zawsze dostępny w dowolnej najnowszej (dostarczonej przez Oracle) JVM.

Jednakże, sprawdzanie null jest bardziej defensywne i nie jest drogie w tym przypadku.

Nigdy nie widziałem, aby user.home miało wartość NULL lub było niepoprawnie określone domyślnie. Należy jednak pamiętać, że użytkownicy mogą przesłonić numer -Duser.home=..., więc nie można polegać na nim, aby wskazać istniejącą ścieżkę.

+1

+1 za wskazanie, że użytkownik może ustawić dowolną właściwość na coś bezsensownego – kdgregory

3

Dokumentacja pan zauważył stwierdza

The getProperty method returns a string containing the value of the property. If the property does not exist, this version of getProperty returns null.

Więc jeżeli nieruchomość nie istnieje uzyskać wartość null

+2

Nie jestem pewien, czy to właśnie miał na myśli. Z pewnością właściwość systemu Java "mambo.jumbo" nie będzie miała żadnego problemu, ale czy możliwe jest niezainicjowanie zwykłej właściwości? –

+0

@PeterJaloveczki: Tak, jestem bardziej zainteresowany warunkami, gdy "domyślne" właściwości nie są zdefiniowane (nie biorąc pod uwagę przypadku, gdy użytkownik ustawił je jawnie na śmieci, np. 'Application.jar -Duser.home = good/luck '. – miku

1

Specyfikacja mówi, że user.home zawiera katalog domowy użytkownika, nie mówi, że może on zawierać null. Nie mam wątpliwości, że JVM gwarantuje, że jest zawsze ustawione.

1

Domyślne właściwości będą się różnić w zależności od systemu operacyjnego. Pojawią się klucze, dla których nie zdefiniowano żadnych wartości. Na mojej maszynie znalazłem user.variant i user.timezone bez żadnych wartości! Poniżej znajduje się kod, który będzie lista w dół wszystkie pary wartość klucza:

Properties prop = System.getProperties();  
     Set<Object> set = prop.keySet();  
     Iterator<Object> itr = set.iterator(); 

     while(itr.hasNext()){ 

      Object obj = itr.next(); 
      String propVal = System.getProperty(obj.toString()); 
       System.out.println(obj.toString()+" = "+propVal); 

     } 
    } 

Odnośnie konkretnego odniesienia o user.home, wydaje się ona zdefiniowana przez większość czasu. Sprawdź to interesting post, gdzie ludzie zamieścili listę właściwości systemu na różnych komputerach.

+0

Dziękuję za twój wgląd i kod – miku

+0

Link do tego pytania dał mi odpowiedź: [System.getProperties] (http://docs.oracle .com/javase/1.5.0/docs/api/java/lang/System.html # getProperties% 28% 29): * Ten zestaw właściwości systemu * ** zawsze zawiera wartości ** * dla następujących kluczy *:. .. 'user.home' ... – miku