有兩個多月沒寫了吧,沒堅持下來,趁着今天生日還沒過,更緊更新一下^=^
1.關於Java的拷貝
Java中沒有引用傳遞的說法,只有值傳遞,而且傳遞的只是一份拷貝。因爲傳遞的是拷貝,所以修改的往往只是拷貝的值,而原來的值沒有變化,但是對於對象引用的拷貝,拷貝的是內存中指向的對象的首地址,因此,通過拷貝修改了對象的內容之後,對象的內容是已經改變了的。三種情況如下:
(1)md.change3(date); //假如讓date+1,date修改的是拷貝的值,原來的值不變
System.out.println(date);
(2)public void change1(Dog dog1){
dog1.setDogAge(6);
} //因爲都指向同一個對象,因此,通過拷貝修改對象,對象其實已經改變。
(3)public void change5(Dog dog){
dog = new Dog("小黑",5);
} //因爲新new了一個對象,所以這個時候是兩個對象,原來的對象不改變
2.沒有被引用的對象被稱爲垃圾對象。垃圾對象的三種情形:
(1) void go(){
Life z = new Life();
}方法結束後滿足垃圾回收
(2) Life z = new Life();
z = new Life();原來指向的對象滿足垃圾回收
(3) Life z = new Life();
z = null; 原來指向的對象滿足垃圾回收
3.異常.
(1)總述:
異常(Exception)是一種特殊的運行錯誤,是在程序運行過程中發生、會打斷程序正常執行的錯誤。Error類對象由Java虛擬機生成並拋出;
A 無法恢復
B OutOfMerroyError
Exception類對象由應用程序處理或拋出
(2)異常Throwable類:
分兩類:a.錯誤Error 如OutOfMerroyError超出內存b.違例Exception
錯誤是沒有辦法的,只能重新啓動機器
違例又分爲:
A 編譯時的錯誤compile error有時也叫checkedException
B 運行時的異常runtimeException有時也叫uncheckedException
編譯異常:SQLException 等
運行異常:ArithmeticException,NullPointerException,NumberFormatException等
程序員只能處理違例,對錯誤無能爲力。
(3) 對於異常的處理:
捕獲異常通過try-catch-finally語句實現。getMessage()一般不用,一般用printStackTrace(),用來打印出異常。
A.如果try{ }塊中有多個異常,當執行到第一個異常時,系統會處理這個異常,其他的異常不會再處理,會被忽略。
B.在catch語句塊中是對違例對象進行處理的代碼,每個try語句塊可以伴隨一個或多個catch語句,用於處理可能產生的不同類型的違例對象。與其它對象一樣,可以訪問一個違例對象的成員變量或調用它的方法。
C. 使用多重 catch 語句時,異常子類一定要位於異常父類之前。也就是說,異常的處理是按金字塔的形狀排列,最後的Exception父類放在最後。如果不按這個順序排列,將會出錯。
D.finally語句是任選的 捕獲例外的最後一步是通過finally語句爲例外處理提供一個統一的出口,使得在控制流轉到程序的其它部分以前,能夠對程序的狀態作統一的管理。不論在try代碼塊中是否發生了異常事件,finally塊中的語句都會被執行。
如果try或者catch塊有return 指令,finally還是會被執行,流程先跳到finally然後再回到return指令
E.格式:
try{
...... //可能產生違例的代碼
}catch( ExceptionName1 e ){
...... //當產生ExceptionName1型違例時的處置措施
}catch( ExceptionName2 e ){
...... //當產生ExceptionName2型違例時的處置措施
} [ finally{
...... //無條件執行的語句
4.拋出異常
(1)聲明:throws,說明下面的代碼塊可能存在異常,但也可能沒有異常,當聲明瞭throws 的時候,可以不拋出throw,說明沒有異常。有throws就一定要執行try--catch--finally
(2)拋出:throw ,當拋出異常thorw後,一定要先在函數名裏聲明throws。然後用try--catch- -finally來處理。但如果拋出的是運行時的異常如RuntimeException則不用在函數名裏聲明throws。
(3)例子
public static void f1() throws Exception{
throw new NullPointerException();
}
5.自定義異常
自定義異常時,如果繼承的是Exception,則需要拋出異常,並且執行try--catch;如果繼承RuntimeException,則不能拋出異常,try--catch可執行也可以不執行。
例子:
public class ItIsAllMyFaultException extends RuntimeException{
private String reason;
public ItIsAllMyFaultException(String reason){
super(reason);
}
==================================================================
public class ExceptionDemo {
public static void main(String[] args) {
/*try{
withDrow();
System.out.println("in the try method");
}
catch(ItIsAllMyFaultException e){
System.out.println("This is my Exception!");
e.printStackTrace();
}
finally{
System.out.println("in the finally method");
}*/
withDrow();
}
public static void withDrow()throws ItIsAllMyFaultException{
int i = 2000;
int j = 4000;
if(i<j){
// throw new ItIsAllMyFaultException();
System.out.println("=============");
}
}
}