`class test {
int x = 10, y = 5;
public static test t1 = new test();
{
System.out.println("NSB");
System.out.println(t1.x);
System.out.println(t1.y);
}
public static void main(String[] args) {
System.out.println("C main");
}
}`
Asked
Active
Viewed 53 times
1 Answers
3
Because the initialization block is executed before the constructor runs, and before the assignment to t1
is made.
So basically, this is executed first : new test()
That invokes the constructor. Just before that constructor runs, the initialization block runs. That block dereferences test.t1
, but no assignment has been made yet.
Thus, Calvinism NPE.

markspace
- 10,621
- 3
- 25
- 39
-
what do you mean by dereference. Could you please elaborate on that point? When the Constructor is invoked ideally there should be memory allocated for both x and y right? – Coder Apr 13 '20 at 20:47
-
"Deference" means to use a reference. `t1` is a reference to the object you are creating, and when you access it by `t1.x` you deference `t1`. It's `t1` that's the problem here, not `x`. Yes memory is allocated for `x` and `y`, but the `t1` has not been assigned yet (the `=` hasn't been executed yet) because you're still in the constructor (in other words `new` hasn't finished yet). – markspace Apr 13 '20 at 21:48