2015-09-16 116 views
1

我是一個Java初學者,使用DrJava和JDK 8.0編譯器,我正在編寫一個簡單的代碼,創建一個類的數組並在另一個類上調用它的長度。我已經回顧了關於數組的許多線程,但我似乎無法找出爲什麼我的代碼不斷破壞。無法使用方法調用數組?

我寫了一個使用同一個類的相同代碼的版本。然而,當我嘗試使用兩個類來運行它,它打破:

這是我的一個類代碼:

public class SingleClass 
{ 
    int array[]; 

    public SingleClass() 
    { 
    array = new int[5]; 
    System.out.println("Array Length: "+returnArrayLength()); 
    } 

    public int returnArrayLength() 
    { 
    return array.length; 
    } 

    public static void main(String arg[]) 
    { 
    SingleClass one = new SingleClass(); 
    } 
} 

當我運行它,它的工作原理:

>run SingleClass 
Array Length: 5 

容易。

但後來我的兩類代碼(我想要的)不起作用。

這裏是我的兩個類:

public class Array 
{ 
    int array[]; 

    public Array() 
    { 
    array = new int[5]; 
    } 

    public int arrayLength() 
    { 
    return array.length; 
    } 
} 

而另外一個:

public class Test 
{ 
    Array testArray; 

    public Test() 
    { 
    returnArrayLength(); 
    } 

    public void returnArrayLength() 
    { 
    System.out.println("array length: "+testArray.arrayLength()); 
    } 

    public static void main(String arg[]) 
    { 
    Array testArray = new Array(); 
    new Test(); 
    } 
} 

當我運行它,我得到一個空指針錯誤:

>run Test 

java.lang.NullPointerException 
    at Test.returnArrayLength(Test.java:12) 
    at Test.<init>(Test.java:7) 
    at Test.main(Test.java:18) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:272) 

我試着使句法完全相同,DrJava認爲沒關係,但出於某種原因,我無法運行此代碼。

什麼可能是我的問題的解決方案?

回答

3

Array對象testArray在您的Test類中與您在主要方法中創建的Array對象testArray不同。您的Test類中的Array永遠不會被初始化,這就是您獲得該異常的原因。

您應該像在主要方法中那樣將testArray傳入Test的構造函數中。

Array testArray = new Array(); 
new Test(testArray); 

現在,你應該在Test改變你的構造函數如下:

public Test(Array array) 
{ 
    testArray = array; 
    returnArrayLength(); 
} 

現在你Test類接受一個Array作爲一個構造函數參數,並將其初始化它,這樣你可以使用它你Test類。

+1

好的建議。 'testArray'也可以做成'private final'。然後編譯器會抱怨缺少初始化。 – Thilo

+0

沒問題。儘管通過編程自己學習肯定是有益的,但我建議你通讀一本書,例如_Java:初學者指南_。這將幫助您掌握Java的基礎知識,並使這樣的東西變得輕而易舉! –

0

您既有一個實例變量又有一個稱爲testArray的局部變量。只有局部變量被初始化。