我正在尝试编译一个使用Processing源代码的类。尝试编译扩展了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('.')
返回-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)
。 PApplet.java
中的第123行是我上面发布的第一行(public class PApplet ...
)。
我怀疑它可能与我的路径和JAVA_HOME系统变量有关。我正在使用JDK 13,它已作为C:\Program Files\Java\jdk-13\bin
添加到我的路径中,并且JAVA_HOME变量设置为C:\Program Files\Java\jdk-13\
这有两个方面:
StringIndexOutOfBoundsException
的事实意味着javaVersionName
字符串为not null
,否则,当调用NullPointerException
时会得到startsWith
1.
之后的字符串部分将有另一个点有各种Java主要版本和供应商,并且版本会随版本而变化。
您应该简单地调试代码,并推断那里返回的值是什么。
作为一个可能不相关的说明,如果您的应用程序是一个applet,则也要保持谨慎(如类名所示)。>
安全考虑:可以限制对系统属性的访问由安全经理。在applet中,这通常是一个问题,被阻止读取某些系统属性和写入任何系统属性。有关在中访问系统属性的更多信息小程序,请参阅《使用Java进行更多操作》中的“系统属性”。互联网应用课程。
来源here。