2012-10-07 37 views
0

我正在創建類的實例數組本身。Scala - 我們如何創建同一類的類實例?

class A (arg: Int) { 
    var a1 = new Array[A] (arg) 
    .... 
} 

聲明它這樣在運行時給出「java.lang.NullPointerException」。有什麼辦法去除這個異常嗎?

+2

您能否提供堆棧跟蹤和更多代碼發生'NullPointerException'的行。 '新數組[A](len)'將創建一個數組,其中包含len NullPointers,它們被「保存」爲A的實例。 – xhochy

回答

1

我確定你正試圖在代碼中稍後訪問數組a1的元素。你有你的例外。代碼

我準備小塊進行論證:

class A (arg: Int) { 
    var a1=new Array[A] (arg) 
    def giveMeException(){ 
     println(a1(0).a1.length) 
    } 
} 
object Program extends App { 
    val noExceptionA = new A(2); 
    noExceptionA.a1(0) = new A(0); 
    noExceptionA.a1(1) = new A(0); 
    val exceptionA = new A(2); 

    // Will print 0 
    noExceptionA.giveMeException(); 

    // Will throw java.lang.NullPointerException 
    exceptionA.giveMeException(); 
} 
+0

嘿,非常感謝你!它幫助了很多! :) – user1726624

0

這一切都歸結到你想要這段代碼實現的目標:

var a1 = new Array[A] (arg) 

我想你想的數組argA類型的元素,但是這些元素應該是什麼?默認情況下,它們是null(或基本類型爲0)。後來你訪問該陣列(例如a1(0),顯然你NullPointerException

所以,你應該填寫創建後的陣列這裏是第一種方法:。

class A (arg: Int) { 
    var al = Array.fill(arg)(new A(arg)) //WRONG! 
} 

注意Array.fill(3)("Foo")結果["Foo", "Foo", "Foo"]陣列當你創建new A(arg)時,你正在遞歸地調用new A(arg)循環永遠不會結束我再也不知道你想達到什麼,所以這裏是一個正常工作的示例:

class A (arg: Int) { 
    var al = Array.fill(arg)(new A(arg - 1)) 
} 

調用new A(3)將創建一個數組[A(2), A(2), A(2)]。輪流撥打A(2)的每個電話將創建[A(1), A(1)]。遞歸結束於new A(0),它創建一個空數組。

相關問題