在Java中传递-D参数时,正确的命令行书写方式是什么,并且如何从代码中访问它?
例如,我尝试过像这样写...
if (System.getProperty("test").equalsIgnoreCase("true"))
{
//Do something
}
然后像这样调用它...
java -jar myApplication.jar -Dtest="true"
但是我收到了一个NullPointerException(空指针异常),我做错了什么?
在Java中传递-D参数时,正确的命令行书写方式是什么,并且如何从代码中访问它?
例如,我尝试过像这样写...
if (System.getProperty("test").equalsIgnoreCase("true"))
{
//Do something
}
然后像这样调用它...
java -jar myApplication.jar -Dtest="true"
但是我收到了一个NullPointerException(空指针异常),我做错了什么?
我猜测问题在于你把"-D"放在了-jar
之后。尝试这样做:
java -Dtest="true" -jar myApplication.jar
从命令行帮助中:
java [-options] -jar jarfile [args...]
换句话说,目前的方式会将 -Dtest="true"
视为要传递给 main
的参数之一,而不是作为 JVM 参数。应该是这样的:
java -Dtest="true" -jar myApplication.jar
那么接下来的代码将返回该值:
System.getProperty("test");
值可能为null
,因此使用Boolean
进行异常保护:
boolean b = Boolean.parseBoolean( System.getProperty( "test" ) );
请注意,getBoolean
方法将委托系统属性值,简化代码如下:
if( Boolean.getBoolean( "test" ) ) {
// ...
}
-Dtest=123
,则对于以下内容也是正确的:Integer.getInteger("test"); Long.getLong("test")
- mtuulu你正在给你的程序传递参数,而不是给Java。使用
java -Dtest="true" -jar myApplication.jar
考虑使用 instead
。
"true".equalsIgnoreCase(System.getProperty("test"))
避免空指针异常。但不要总是无脑使用“约达条件”,有时抛出空指针异常是正确的行为,而有时则需要像这样:
System.getProperty("test") == null || System.getProperty("test").equalsIgnoreCase("true")
正确的(提供默认值为 true)。更短的选项是
!"false".equalsIgnoreCase(System.getProperty("test"))
但是不使用双重否定并不能使人更容易理解它。
System.getProperty("test", "true").equalsIgnoreCase("true")
是编写最后一个条件的更好方式。 - Paŭlo Ebermann
compareToIgnoreCase
而不是equalsIgnoreCase
来处理与语言环境无关的标识符;否则,您可能会遇到土耳其的四个“İ”的问题,以及其他一些问题。 - McDowell