Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-6676362

Spurious forward reference error with final var + instance variable initializer

XMLWordPrintable

    • b34
    • generic
    • generic
    • Not verified

      This program wrongly generates an 'illegal forward reference' error (at obj's declaration...even if the error was justified, it should occur at obj's use) :-

      class Huh {
          Runnable r = new Runnable() {
              public void run() {
                  Object o = obj;
              }
          };
          final Object obj = r;
      }

      The following program is morally equivalent (the JLS treats instance variable initializers and instance initializers uniformly) and does not generate an error:

      class Huh {
          Runnable r;
          {
              r = new Runnable() {
                  public void run() {
                      Object o = obj;
                  }
              };
          }
          final Object obj = r;
      }
      Simpler test case, given the following program

      class Test {
          final int a = b;
          final int b = a;
      }

      the compiler should report only ONE error, instead of two, as it can be seen from the output:

      Test.java:33: illegal forward reference
          final int a = b;
                        ^
      Test.java:34: illegal forward reference
          final int b = a;
                        ^
      2 errors

      While the first error is correct, the second one is a bug, accordingly to JLS 8.3.2.3

            mcimadamore Maurizio Cimadamore
            abuckley Alex Buckley
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

              Created:
              Updated:
              Resolved:
              Imported:
              Indexed: