java - System.getProperty("java.version") 返回 Null
问题描述
我正在尝试编译一个使用 Processing 3.4 源代码的类。StringIndexOutOfBoundsException
尝试编译扩展的类时,我得到了一个PApplet
。
该PApplet
课程有以下代码,我认为这是问题所在
public class PApplet implements PConstants {
/** Full name of the Java version (i.e. 1.5.0_11). */
static public final String javaVersionName =
System.getProperty("java.version");
static public final int javaPlatform;
static {
String version = javaVersionName;
if (javaVersionName.startsWith("1.")) {
version = version.substring(2);
javaPlatform = parseInt(version.substring(0, version.indexOf('.')));
} else {
// Remove -xxx and .yyy from java.version (@see JEP-223)
javaPlatform = parseInt(version.replaceAll("-.*","").replaceAll("\\..*",""));
}
}
我认为字符串javaVersionName
被设置为 null 或其他一些导致version.indexOf('.')
return的奇怪值-1
。
堆栈跟踪:
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke (Method.java:567)
at org.codehaus.mojo.exec.ExecJavaMojo$1.run (ExecJavaMojo.java:293)
at java.lang.Thread.run (Thread.java:830)
Caused by: java.lang.StringIndexOutOfBoundsException: begin 0, end -1, length 2
at java.lang.String.checkBoundsBeginEnd (String.java:3720)
at java.lang.String.substring (String.java:1909)
at processing.core.PApplet.<clinit> (PApplet.java:123)
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke (Method.java:567)
at org.codehaus.mojo.exec.ExecJavaMojo$1.run (ExecJavaMojo.java:293)
at java.lang.Thread.run (Thread.java:830)
那里的某个地方说at processing.core.PApplet.<clinit> (PApplet.java:123)
。第 123行是我在上面发布PApplet.java
的第一行 ( public class PApplet ...
)。
我怀疑这可能与我的路径和 JAVA_HOME 系统变量有关。我正在使用 JDK 13,它被添加到我的路径中,C:\Program Files\Java\jdk-13\bin
并且 JAVA_HOME 变量设置为C:\Program Files\Java\jdk-13\
编辑:我班的主要功能是这样的
static public void main(String[] passedArgs) {
String[] appletArgs = new String[] { "Demo" };
if (passedArgs != null) {
PApplet.main(concat(appletArgs, passedArgs));
} else {
PApplet.main(appletArgs);
}
}
编辑:我还应该提到PApplet
我在上面发布的片段不是我使用的实际来源,只是我在网上找到的东西。我拥有的实际来源在一个core.jar
文件夹中。我不能毫不费力地改变来源。
解决方案
这有两个方面:
- 在上下文中抛出a 的事实
StringIndexOutOfBoundsException
意味着javaVersionName
字符串 is notnull
,否则,你会得到一个NullPointerException
whenstartsWith
被调用 - 这里的问题是假设字符串后面的部分
1.
将有另一个点
有各种 Java 主要版本和供应商,并且版本会根据这些而变化。
您应该简单地调试您的代码并推断那里返回的值到底是什么。
作为一个可能不相关的注释,如果(如类名所示)您的应用程序是一个小程序,您还需要谨慎:
安全注意事项:安全管理器可以限制对系统属性的访问。这通常是小程序中的一个问题,它无法读取某些系统属性,也无法写入任何系统属性。有关在 applet 中访问系统属性的更多信息,请参阅 Doing More With Java Rich Internet Applications 课程中的系统属性。
来源在这里。
推荐阅读
- bash - 在 bash Shell 脚本中将带有偏移字符串的 GMT 转换为 MST
- c# - 如何让这个三元运算符在 cshtml 页面上工作?
- javascript - 从 API 中的对象获取数据
- java - 使用 CollapsingToolbarLayout 时 RecyclerView 项目不适合
- r - R swirl() 课程获取和清理数据使用 dplyr 操作数据。R 遇到致命错误
- python - 如何打印 2 个列表的所有相应元素并用文本分隔它们?
- java-8 - openjdk:Solaris 11 X86 中的 jdk8u 构建错误
- javascript - JS 在条件句中使用数据属性
- sql - 如何从表中找到回归计数?
- python-3.x - 使用 f 字符串输出 LaTeX 符号