正确使用 Java-D 命令行参数

在 Java 中传递-D 参数时,编写命令行然后从代码访问它的正确方法是什么?

例如,我曾经试着写过这样的东西..。

if (System.getProperty("test").equalsIgnoreCase("true"))
{
//Do something
}

然后这么说..。

java -jar myApplication.jar -Dtest="true"

但是我收到一个 NullPointerException。我做错了什么?

233293 次浏览

我怀疑问题在于你把“-D”字母 之后写成了 -jar。试试这个:

java -Dtest="true" -jar myApplication.jar

从命令行帮助:

java [-options] -jar jarfile [args...]

换句话说,您目前得到的方法将把 -Dtest="true"作为要传递给 main的参数之一,而不是作为一个 JVM 参数。

(您可能应该删除引号 还有,但它可能无论如何都会很好地工作——这可能取决于您的 shell。)

应该是:

java -Dtest="true" -jar myApplication.jar

然后,下面的代码将返回值:

System.getProperty("test");

不过,该值可以是 null,因此要防止使用 Boolean出现异常:

boolean b = Boolean.parseBoolean( System.getProperty( "test" ) );

注意,getBoolean方法委托系统属性值,将代码简化为:

if( Boolean.getBoolean( "test" ) ) {
// ...
}

你给你的程序设置了参数,而不是 Java

java -Dtest="true" -jar myApplication.jar

取而代之。

考虑使用

"true".equalsIgnoreCase(System.getProperty("test"))

为了避免 NPE。但是不要总是不假思索地使用“ 尤达条件”,有时候扔 NPE 是正确的行为,有时候就像这样

System.getProperty("test") == null || System.getProperty("test").equalsIgnoreCase("true")

是正确的(提供默认为真)

!"false".equalsIgnoreCase(System.getProperty("test"))

但是不使用双重否定并不能减少误解。