在Java中传递-D参数时,编写命令行然后从代码中访问它的正确方法是什么?
例如,我尝试过写这样的东西......
if (System.getProperty("test").equalsIgnoreCase("true"))
{
//Do something
}
然后这样称呼它......
java -jar myApplication.jar -Dtest="true"
但是我收到了NullPointerException。我做错了什么?
答案 0 :(得分:222)
我怀疑问题是你在 -jar
之后放了“-D”。试试这个:
java -Dtest="true" -jar myApplication.jar
从命令行帮助:
java [-options] -jar jarfile [args...]
换句话说,您现在获得它的方式将-Dtest="true"
视为传递给main
而不是作为JVM参数的参数之一。
(您应该也删除引号,但它仍然可以正常工作 - 它可能取决于您的shell。)
答案 1 :(得分:37)
应该是:
java -Dtest="true" -jar myApplication.jar
然后以下将返回值:
System.getProperty("test");
值可以是null
,因此使用Boolean
防范异常:
boolean b = Boolean.parseBoolean( System.getProperty( "test" ) );
请注意,getBoolean
方法委托系统属性值,将代码简化为:
if( Boolean.getBoolean( "test" ) ) {
// ...
}
答案 2 :(得分:20)
您为程序提供参数而不是Java。使用
java -Dtest="true" -jar myApplication.jar
代替。
考虑使用
"true".equalsIgnoreCase(System.getProperty("test"))
避免NPE。但是不要总是不加思索地使用“尤达条件”,有时候抛出NPE是正确的行为,有时像是
System.getProperty("test") == null || System.getProperty("test").equalsIgnoreCase("true")
是对的(提供默认值为true)。可能性较短
!"false".equalsIgnoreCase(System.getProperty("test"))
但不使用双重否定并不会减少误解。