1 回答

TA貢獻(xiàn)41條經(jīng)驗(yàn) 獲得超26個(gè)贊
首先你要明白一個(gè)類的初始化順序,先初始化類中的屬性(如果是基礎(chǔ)數(shù)據(jù)類型初始化為0,如果是引用類型,初始化為null。),再執(zhí)行該類的構(gòu)造函數(shù),如果構(gòu)造中有初始化屬性的代碼,會(huì)對(duì)屬性進(jìn)行第二次初始化。
當(dāng)執(zhí)行到 Volume?vol=new?Volume(cir,5);語句時(shí),系統(tǒng)會(huì)最先初始化Volume類中所有的屬性,依次執(zhí)行heigh=0,circle=null, 當(dāng)執(zhí)行到double?s=circle.getArea();時(shí),發(fā)現(xiàn)是一個(gè)賦值的表達(dá)式,這時(shí)候系統(tǒng)會(huì)先執(zhí)行右邊的表達(dá)式,會(huì)調(diào)用circle.getArea(), 問題就出在這里,因?yàn)檫@時(shí)circle=null, 空值的引用是不能調(diào)用任何方法的,只有實(shí)例對(duì)象才能調(diào)用相應(yīng)的方法,所以就拋出了異常。在java中,對(duì)一個(gè)類初始化的時(shí)候,有時(shí)并不是按照代碼的寫書順序來執(zhí)行的,你將double?s=circle.getArea();寫到程序的最后,它還是會(huì)在構(gòu)造方法之前得到執(zhí)行。
知道了為什么出錯(cuò),解決起來就簡(jiǎn)單了,你可以先定義一個(gè)double s; 然后定義一個(gè)方法,在方法中調(diào)用?s=circle.getArea(); ?如下面的代碼:
class?Volume{ ????double?heigh; ????Circle?circle; ????double?s; ???? ????public?Volume(Circle?c,double?h){ ????????circle=c; ????????heigh=h; ????} ????public?double?area(){ ????????s?=?circle.getArea();??? ????}? ?}
當(dāng)然你也可以在構(gòu)造函數(shù)當(dāng)中對(duì) s 進(jìn)行初始化,如下面的代碼:
class?Volume{ ????double?heigh; ????Circle?circle; ????double?s; ???? ????public?Volume(Circle?c,double?h){ ????????circle=c;?//這里circle已經(jīng)得到正確的初始化 ????????heigh=h; ????????s=circle.getArea();//所以這里可以調(diào)用相應(yīng)的方法 ????} ????????? ????public?void?getVolume(){ ????????double?volume=s*heigh; ????????System.out.println("體積是"+volume); ????} }
總之一句話,在使用circle之前必須保證circle得到了正確的初始化。
添加回答
舉報(bào)