有時我們會想:「如果異常發生了,所有的東西都能被正確清理嗎?」
當涉及到構造器時,又會怎樣呢?
總結來說:在構造器內,如果丟擲了異常,那麼此時這些清理行為也許不能正常工作。
我們還需要考慮的是:如果構造器在其執行過程中半途而廢了,也許該物件的某些部分還沒有被成功建立,而這些部分在finally子句中確是要被清理的。在這,我們還能用finally來解決這個問題嗎?
答案是不能的,我們對於那些在構造階段可能會丟擲異常,並且要求清理的類,最安全的方式就是使用巢狀的try子句。
這種通用的清理法既使在構造器不丟擲異常時,我們也應該應用,規則:在建立需要清理的物件之後,立即進入乙個try-finally語句塊:
class needscleanup
}class constructionexception extends exception{}
class needscleanup2 extends needscleanup
}public class cleanupidiom finally
//section 2:
//if construction cannot fail you can group objects
needscleanup nc2 = new needscleanup();
needscleanup nc3 = new needscleanup();
try finally
//section 3:
//if construction can fail you must guard each one
try finally
}catch(constructionexception e) finally
}catch(constructionexception e)
}}class needscleanup
}class constructionexception extends exception{}
class needscleanup2 extends needscleanup
}public class cleanupidiom finally
//section 2:
//if construction cannot fail you can group objects
needscleanup nc2 = new needscleanup();
needscleanup nc3 = new needscleanup();
try finally
//section 3:
//if construction can fail you must guard each one
try finally
}catch(constructionexception e) finally
}catch(constructionexception e)
}}
**分析:
在main()中,section 1是比較簡單的,遵循了在可去除物件之後緊跟try-finally的原則。構造失敗,我們不需要使用catch。
section 2是為了構造和清理,可以看到具有不能失敗的構造器物件可以群組在一起。
section 3:是顯示了如何處理那些具有可以失敗的構造器,且需要清理的物件。這對於每乙個構造器來說,都必須包含在其自己的try-finally語句塊中,並且每乙個物件構造器都必須跟隨乙個try-finally語句塊以保證正確清理。
執行結果:
構造器(構造方法)
知識點 1.乙個類即使什麼都不寫,他也會存在乙個方法 構造器 構造方法 2.構造方法的名字必須與定義他的類名完全相同,沒有返回型別,甚至連void也沒有。3.構造方法的呼叫是在建立乙個物件時使用new操作進行的。構造方法的作用是初始化物件。4.有參構造 一旦定義了有參構造,無參一定要寫出來!pack...
構造器(構造方法)
題目 編寫兩個類 和 test,其中 類中宣告私有的底邊長base和高height,同時宣告公共方法訪問私有變數。此外,提供類必要的構造器。另乙個類中使用這些公共方法,計算三角形的面積。回答 public class test public int a,int b public void setba...
建構函式中拋異常
1 建構函式中是否可以拋異常?可以。2 有什麼限制嗎?有限制。構造拋異常之前必須把已經申請的資源釋放掉。這樣,就算你的物件是new出來的,也不會造成記憶體洩漏。因為析構函式不會被呼叫,所以丟擲異常後,你沒機會釋放資源。建議,在建構函式中不要做過多的事情,只是能對成員變數的做初始化工作就好了。真的需要...