2010-04-07 37 views
1

我正在將this code轉換成Clojure。正如你所看到的,我必須延長課程ArthurFrame,但我每次使用(proxy [ArthurFrame] [] ...)時都會收到IllegalAccessErrorIllegalAccessError和代理

任何想法爲什麼?這裏是class's source

謝謝!

編輯:Here is the full error stack在REPL上運行(代理[ArthurFrame] [])。

編輯2:實際上,甚至實例化類都會產生錯誤。下面是(ArthurFrame. wid)輸出:

 
tried to access class com.trolltech.demos.ArthurFrame from class user$eval__2205 
    [Thrown class java.lang.IllegalAccessError] 

Restarts: 
0: [ABORT] Return to SLIME's top level. 

Backtrace: 
    0: user$eval__2205.invoke(NO_SOURCE_FILE:1) 
    1: clojure.lang.Compiler.eval(Compiler.java:4642) 
    2: clojure.core$eval__5254.invoke(core.clj:2031) 
    3: swank.commands.basic$eval_region__907.invoke(basic.clj:40) 
    4: swank.commands.basic$eval_region__907.invoke(basic.clj:31) 
    5: swank.commands.basic$eval__927$listener_eval__929.invoke(basic.clj:54) 
    6: clojure.lang.Var.invoke(Var.java:359) 
    7: user$eval__2202.invoke(NO_SOURCE_FILE) 
    8: clojure.lang.Compiler.eval(Compiler.java:4642) 
    9: clojure.core$eval__5254.invoke(core.clj:2031) 
10: swank.core$eval_in_emacs_package__455.invoke(core.clj:59) 
11: swank.core$eval_for_emacs__533.invoke(core.clj:128) 
12: clojure.lang.Var.invoke(Var.java:367) 
13: clojure.lang.AFn.applyToHelper(AFn.java:179) 
14: clojure.lang.Var.applyTo(Var.java:476) 
15: clojure.core$apply__4379.invoke(core.clj:434) 
16: swank.core$eval_from_control__458.invoke(core.clj:66) 
17: swank.core$eval_loop__461.invoke(core.clj:71) 
18: swank.core$spawn_repl_thread__595$fn__627$fn__629.invoke(core.clj:183) 
19: clojure.lang.AFn.applyToHelper(AFn.java:171) 
20: clojure.lang.AFn.applyTo(AFn.java:164) 
21: clojure.core$apply__4379.invoke(core.clj:434) 
22: swank.core$spawn_repl_thread__595$fn__627.doInvoke(core.clj:180) 
23: clojure.lang.RestFn.invoke(RestFn.java:402) 
24: clojure.lang.AFn.run(AFn.java:37) 
25: java.lang.Thread.run(Thread.java:619) 
+1

請問您能給出完整的異常堆棧跟蹤嗎? – 2010-04-07 06:01:41

+0

請問您可以在代碼中包含代碼而不是鏈接到代碼。鏈接中斷。 – 2016-09-11 23:47:30

回答

4

問題是ArthurFrame的可見性是不公開的,所以代理不能訪問它,因爲代理不屬於com.trolltech.demos包。你必須公開ArthurFrame。

+0

生活和學習......我認爲默認行爲是將它設置爲公開! – konr 2010-04-07 13:43:27

1

你的問題的最可能的原因是,一些尚未被重新編譯。這裏的IllegalAccessError異常的javadoc的描述:

當應用程序試圖訪問或修改字段,或調用它不能訪問的方法拋出。

通常,編譯器會捕獲此錯誤;如果某個類的定義發生了不兼容的更改,則只能在運行時發生此錯誤。

更具體地講,當你有類AB這通常發生,其中B取決於A一些成員。然後,你做這樣的事情:

  1. 編譯A,然後B

  2. A做一個不兼容的更改並重新編譯它沒有重新編譯B。在這種情況下,更改將涉及降低B使用A的某些成員的可見性,以便該成員對B不再可見。

  3. 運行使用AB的應用程序,您將得到一個IllegalAccessError

編輯

正在試圖做訪問看起來像它必須是由Clojure的編譯器生成的代理類。所以也許有一個Clojure編譯器錯誤...或者你在運行Clojure編譯器後改變了ArthurFrame的可見性。無論哪種方式,一種可能的解決辦法是將ArthurFrame的可見性更改爲public