首页 > 解决方案 > 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文件夹中。我不能毫不费力地改变来源。

标签: javaprocessing

解决方案


这有两个方面:

  • 在上下文中抛出a 的事实StringIndexOutOfBoundsException意味着javaVersionName字符串 is not null,否则,你会得到一个NullPointerExceptionwhenstartsWith被调用
  • 这里的问题是假设字符串后面的部分1.将有另一个点

有各种 Java 主要版本和供应商,并且版本会根据这些而变化。

您应该简单地调试您的代码并推断那里返回的值到底是什么。

作为一个可能不相关的注释,如果(如类名所示)您的应用程序是一个小程序,您还需要谨慎:

安全注意事项:安全管理器可以限制对系统属性的访问。这通常是小程序中的一个问题,它无法读取某些系统属性,也无法写入任何系统属性。有关在 applet 中访问系统属性的更多信息,请参阅 Doing More With Java Rich Internet Applications 课程中的系统属性。

来源在这里


推荐阅读