Podczas przekazywania parametru -D w Javie, jaki jest właściwy sposób pisania wiersza poleceń, a następnie uzyskiwania do niego dostępu z kodu?
Na przykład próbowałem napisać coś takiego ...
if (System.getProperty("test").equalsIgnoreCase("true"))
{
//Do something
}
A potem nazywam to tak ...
java -jar myApplication.jar -Dtest="true"
Ale otrzymuję wyjątek NullPointerException. Co ja robię źle?
java
command-line
parameters
Ryan Berger
źródło
źródło
compareToIgnoreCase
zamiastequalsIgnoreCase
identyfikatorów niezależnych od ustawień regionalnych; w przeciwnym razie możesz napotkać między innymi problem tureckiej czwórki.Odpowiedzi:
Podejrzewam, że problemem jest to, że już umieścić „D” po
-jar
. Spróbuj tego:Z pomocy wiersza poleceń:
Innymi słowy, sposób, w jaki masz to w tej chwili, będzie traktowany
-Dtest="true"
jako jeden z argumentów do przekazania,main
a nie jako argument JVM.(Prawdopodobnie powinieneś również porzucić cudzysłowy, ale może i tak działać - prawdopodobnie zależy to od twojej powłoki.)
źródło
To powinno być:
Następnie poniższe zwrócą wartość:
Wartość mogłaby jednak być
null
, więc chroń się przed wyjątkami za pomocąBoolean
:Zauważ, że
getBoolean
metoda deleguje wartość właściwości systemowej, upraszczając kod do:źródło
Integer.getInteger("test"); Long.getLong("test")
zakładając, że masz-Dtest=123
Zamiast tego podajesz parametry swojemu programowi. Posługiwać się
zamiast.
Rozważ użycie
aby uniknąć NPE. Ale nie używaj " warunków Yody " zawsze bez zastanowienia, czasami rzucanie NPE jest właściwym zachowaniem, a czasem czymś w rodzaju
ma rację (podając domyślną wartość true). Jest krótsza możliwość
ale brak podwójnej negacji nie sprawia, że nieporozumienie jest mniej trudne.
źródło
System.getProperty("test", "true").equalsIgnoreCase("true")
to byłby lepszy sposób na zapisanie ostatniego warunku.Boolean.getBoolean("test");
to inna opcja. Zobacz .