Похоже, вы немного обманываете;)
Код, который вы показали, уже после исправления для правильной обработки версии Java с момента выпуска 9
- здесь у вас немного другая версиядля основных версий и исправленных версий.
Похоже, что ваш core.jar
является предмитом:
https://github.com/processing/processing/commit/b0b2d89228c8bf178f5113a4af25779a14f242e1#diff-29e1de29464981394819a89e38e87288
, где обработка свойства java.version
была исправлена.
Итак, ваш пример кода должен иметь вид
public class PApplet {
static public final String javaVersionName =
System.getProperty("java.version");
static public final int javaPlatform =
PApplet.parseInt(PApplet.split(javaVersionName, '.')[1]);
static public String[] split(String value, char delim) {
// do this so that the exception occurs inside the user's
// program, rather than appearing to be a bug inside split()
if (value == null) return null;
//return split(what, String.valueOf(delim)); // huh
char chars[] = value.toCharArray();
int splitCount = 0; //1;
for (int i = 0; i < chars.length; i++) {
if (chars[i] == delim) splitCount++;
}
// make sure that there is something in the input string
//if (chars.length > 0) {
// if the last char is a delimeter, get rid of it..
//if (chars[chars.length-1] == delim) splitCount--;
// on second thought, i don't agree with this, will disable
//}
if (splitCount == 0) {
String splits[] = new String[1];
splits[0] = value;
return splits;
}
//int pieceCount = splitCount + 1;
String splits[] = new String[splitCount + 1];
int splitIndex = 0;
int startIndex = 0;
for (int i = 0; i < chars.length; i++) {
if (chars[i] == delim) {
splits[splitIndex++] =
new String(chars, startIndex, i-startIndex);
startIndex = i + 1;
}
}
//if (startIndex != chars.length) {
splits[splitIndex] =
new String(chars, startIndex, chars.length-startIndex);
//}
return splits;
}
static final public int parseInt(String what) {
return parseInt(what, 0);
}
static final public int parseInt(String what, int otherwise) {
try {
int offset = what.indexOf('.');
if (offset == -1) {
return Integer.parseInt(what);
} else {
return Integer.parseInt(what.substring(0, offset));
}
} catch (NumberFormatException e) { }
return otherwise;
}
public static void main(String [] args) {
System.out.println("Java version: " + javaPlatform);
}
}
и для основного
public class Main {
static public void main(String[] passedArgs) {
String[] appletArgs = new String[] { "Demo" };
PApplet.main(appletArgs);
}
}
, где вы получите свое исключение
> javac PApplet.java
> javac Main.java
> java -cp . Main
Exception in thread "main" java.lang.ExceptionInInitializerError
at Main.main(Main.java:7)
Caused by: java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 1
at PApplet.<clinit>(PApplet.java:6)
... 1 more
, есливы используете тик, предложенный в комментарии, вы можете сделать его «фиксированным»
public class Main {
static public void main(String[] passedArgs) {
String[] appletArgs = new String[] { "Demo" };
System.setProperty("java.version", "1.1.1");
PApplet.main(appletArgs);
}
}
, и вы получите код, выполняющийся
> javac PApplet.java
> javac Main.java
> java -cp . Main
Java version: 1
Итак, в заключение, почему бы не собрать его из большинствапоследние источники? :)
Альтернативный подход - немного хакерский
Допустим, вы не можете изменить ни Main.java
, ни core.jar
. Здесь вы можете обмануть Java
, где искать PApplet.class
. Вы можете создать каталог - назовем его fix
. Внутри fix
вы можете собрать только один класс: PApplet.java
. И затем вы можете запустить код следующим образом:
> java -cp fix:. Main
, где исправление содержит вашу специально созданную версию
public class PApplet {
static public final String javaVersionName =
System.getProperty("java.version");
static public final int javaPlatform = 1;
public static void main(String [] args) {
System.out.println("Java version: " + javaPlatform);
}
}