NullPointerException в коде, созданном с помощью ассемблера байт-кода jasmin

Этот код генерирует исключение java.lang.NullPointerException. Я пытаюсь скомпилировать немного кода для jvm, и это то, что выводит мой компилятор

.class  public  test
.super  java/lang/Object
.field static   i  [I
.method  public static  main([Ljava/lang/String;)V
invokestatic    test/main()V
return
.limit  locals  1
.limit  stack  20
.end    method
.method  public static  main()V
.limit  locals  8
getstatic   test/i  [I
ldc 1
ldc 5
iastore
return
.limit  stack  20
.end    method

Однако это не работает, и я могу понять, откуда взялась ошибка (номер строки не указан).

Я держу пари, что он неправильно сохраняет значение из глобального массива в строках

getstatic   test/i  [I
ldc 1
ldc 5
iastore

Мой вопрос в том, как это скомпилировать


person Vladimir_314159    schedule 30.11.2018    source источник
comment
Я не понимаю, где вы когда-нибудь присваиваете значение test.i. Как выглядит код на вашем исходном языке? Если это что-то вроде int[] i; void main() { i[1] = 5; }, то ваш сгенерированный байт-код правильный (при условии семантики, подобной Java), просто исходный код вызывает NPE.   -  person sepp2k    schedule 30.11.2018


Ответы (1)


Это будет компилироваться в код Java

public class Test {
    static int[] i;
    public static void main(String[] args) {
        main();
    }
    public static void main() {
        i[1] = 5;
    }
}

Если вы скомпилируете и запустите это, вы увидите, что он генерирует исключение NullPOinterException, потому что ничто не создает массив int для хранения в i. Вам нужно создать int[] объект измерения 2 (как минимум), используя newarray, чтобы этот код работал.

person Ernest Friedman-Hill    schedule 30.11.2018