Исключение нулевого указателя не выдается во время операции присваивания - PullRequest
0 голосов
/ 17 января 2020

В java операции присваивания, для операции присваивания: выражение правой стороны вычисляется сначала, а затем присваивается левой стороне. В приведенном ниже фрагменте кода я ожидал, что операция присваивания выдаст исключение нулевого указателя, но это не так. Может кто-нибудь объяснить, почему?

public class MainClass {

  public static void main(String[] args) {
    Class1 c = new Class1();
    c.x = tell(c = null);
  }

  private static int tell(Object o) {
    return 11;
  }

}

public class Class1 {
  public int x;
}

Ответы [ 2 ]

1 голос
/ 17 января 2020

Это потому, что вы неправильно понимаете порядок операций присваивания.

«выражение правой стороны вычисляется сначала, а затем присваивается левой стороне» означает, что вы присваиваете правое значение слева значение после оценки правильного значения. В нем ничего не сказано о порядке вычисления левого значения.

В Java сначала выполняется оценка левой стороны, затем выполняется оценка правой стороны, а затем назначается правая сторона левой стороне. Вы можете проверить это, запустив следующий код:

public class MainClass {

    public static void main(String[] args) {
        Class1 c = new Class1();
        (c.echo("left")).x = tell(c.echo("right")); // Prints "left", then "right"
    }

    private static int tell(Object o) {
        return 11;
    }

}

public class Class1 {
    public int x;

    public Class1 echo(String text) {
        System.out.println(text);
        return this;
    }
}
0 голосов
/ 17 января 2020

Ваша проблема в этой строке:

c.x = tell(c = null);

То, что происходит:

  1. c установлено в ноль (c = ноль)
  2. Затем происходит вызов, чтобы сказать, и это возвращает целое число
  3. Затем он пытается установить c .x, но c теперь ноль
...