構造器異常

2021-09-24 13:41:27 字數 1862 閱讀 4442

有時我們會想:「如果異常發生了,所有的東西都能被正確清理嗎?」

當涉及到構造器時,又會怎樣呢?

總結來說:在構造器內,如果丟擲了異常,那麼此時這些清理行為也許不能正常工作。

我們還需要考慮的是:如果構造器在其執行過程中半途而廢了,也許該物件的某些部分還沒有被成功建立,而這些部分在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出來的,也不會造成記憶體洩漏。因為析構函式不會被呼叫,所以丟擲異常後,你沒機會釋放資源。建議,在建構函式中不要做過多的事情,只是能對成員變數的做初始化工作就好了。真的需要...