メソッドの動的追加

コメントで教えてサイトでExpandoに関して多少理解できたが、相変わらず混乱する。ルールをきちんと理解する必要があると感じた。以下のようにExpandoを継承すると動的にメソッド(のようなもの。実際はクロージャ)を追加できる。

class Foo extends Expando {
  def a
  def foo() {
    a=1
    bar()
  }
}
def f = new Foo()
f.bar = {println a}
f.foo()

//実行結果
1

以下のようにExpandoの特性を持っていないとプロパティbarにアクセスできない。

class Foo {
  def a
  def foo() {
    a=1
    bar()
  }
}
def f = new Foo()
f.bar = {println a}
f.foo()

//実行結果
groovy.lang.MissingPropertyException: No such property: bar for class: Foo
	at Foo.setProperty(Script77)
	at Script77.run(Script77:9)

Expandoを継承するとOKだが、以下のようにbarをプロパティとするとエラー。

class Foo extends Expando {
  def a
  def bar
  def foo() {
    a=1
    bar()
  }
}
def f = new Foo()
f.bar = {println a}
f.foo()

//実行結果
java.lang.NullPointerException
	at Foo.foo(Script79:6)
	at Foo$foo.call(Unknown Source)
	at Script79.run(Script79:11)

何でだろう?実行時エラーではなくコンパイル時のエラー?