2013-06-10 11 views
10

Ci sono un paio di Java system properties, tra cui cose come java.home e path.separator, user.home. Lo spec non menziona alcuna promessa formale sull'esistenza di quei valori.Le proprietà di sistema Java sono sempre non nulle?

Soprattutto sono interessato a user.home. Indica sempre un percorso esistente?

+0

penso che queste siano le chiavi – anshulkatta

+0

@anshulkatta; Immagino che le chiavi esistano sempre - ma la domanda è: indicano sempre qualcosa (sano?). – miku

+0

Le chiavi @miku esistono solo quando c'è un valore, controlla la mia risposta sotto – DevZer0

risposta

4

penso che si può tranquillamente supporre che tutte le proprietà in tale elenco è sempre disponibile in qualsiasi JVM recente (fornita da Oracle).

Tuttavia, un controllo null è più difensivo e non costoso in questo caso.

Non ho mai visto user.home essere nullo o essere specificato in modo errato per impostazione predefinita. Tuttavia, tieni presente che gli utenti possono eseguire l'override con -Duser.home=..., quindi non puoi fare affidamento su di esso per puntare a un percorso esistente.

+1

+1 per indicare che l'utente può impostare qualsiasi proprietà a qualcosa di assurdo – kdgregory

3

La documentazione è stato evidenziato afferma

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

Quindi, se la proprietà non esiste si ottiene un valore di null

+2

Non sono sicuro che sia quello che intendeva. Sicuramente la proprietà di sistema Java "mambo.jumbo" sarà nullo, nessun problema, ma è possibile che una proprietà normale non sia inizializzata? –

+0

@PeterJaloveczki: Sì, sono più interessato alle condizioni in cui le proprietà "predefinite" non sono definite (non considerando il caso, quando l'utente le imposta esplicitamente su spazzatura, come 'application.jar -Duser.home = buona/fortuna ' – miku

1

La specifica dice che user.home contiene la home directory dell'utente, non dice che può contenere null. Non ho dubbi che JVM garantisce che è sempre impostato.

1

Le proprietà predefinite variano a seconda del sistema operativo. Ci saranno alcune chiavi per le quali non sono definiti valori. Sulla mia macchina ho trovato user.variant e user.timezone senza alcun valore! Di seguito è riportato il codice che elenca giù tutte le coppie di valori chiave:

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

     } 
    } 

Per quanto riguarda il vostro riferimento specifiche su user.home, a quanto pare ha definito la maggior parte del tempo. Dai un'occhiata a questo interesting post dove le persone hanno pubblicato l'elenco delle proprietà di sistema su macchine diverse.

+0

Grazie per il tuo approfondimento e codice – miku

+0

Il link alla domanda mi ha dato una risposta: [System.getProperties] (http://docs.oracle .com/javase/1.5.0/docs/api/java/lang/System.html # getProperties% 28% 29): * Questo insieme di proprietà di sistema * ** include sempre valori ** * per le seguenti chiavi *:. .. 'user.home' ... – miku