1. 程式人生 > >java異常類 Object類

java異常類 Object類

1.Object類
Object類是所有類的父類,是最頂層的父類.

當一個類沒有直接繼承其它父類時,這個類的直接父類就是Object類.
class Person {
...
}

等價於

class Person extends Object {
...

}

Object 裡的equals方法:

boolean equals(Object obj):判斷當前物件與obj物件的地址是否一樣,如果一樣就返回true,否則返回false;

boolean equals(Object obj){
        
        return this=obj;
}

因為object類自帶的equals方法不能滿足需求,所以重寫equals方法;
重寫的目標:
1.如果兩個物件的地址一樣就返回true;
2.否則 如果兩個物件中資料都一樣也返回true;
3.否則 返回false;

使用eclipse快捷生成程式碼 Shift+Alt+S 

Object 裡的 String toString()方法:
是用來返回物件的字串表示;

Object類中的toString方法預設返回物件的地址;
 public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
想要列印物件的內容 就需要重寫toString 方法

使用eclipse快捷生成程式碼 Shift+Alt+S 


2.異常

java程式碼中出現的不正常的情況;

Throwable類是異常類的繼承結構中最頂層的異常類;


Throwable
|--Error:錯誤,java程式碼中出現非常嚴重的問題,不修改程式碼問題解決不了,就象人患了癌症,不動手術活不下去;
|--Exception:異常,java程式碼中出現一般的問題,只要處理一下就解決了.就象人患了感冒,發燒,只要吃點藥就可以了.
|-執行時異常:RuntimeException:NullPointerException,ArrayIndexOutOfBoundsException;
|-編譯時異常:FileNotFoundException,IOException;

通常說的異常值的是Exception,不是Error.

怎麼區分是Error還是Exception?
異常的名字如果是以Error結尾的,表示這個異常是一個錯誤: java.lang.OutOfMemoryError
異常的名字如果是以Exception結尾的,表示這個異常是一個普通的異常:java.io.FileNotFoundException

常見的異常:
1.空指標異常:NullPointerException;
2.陣列索引越界的異常:ArrayIndexOutOfBoundsException;
3.檔案找不到的異常:FileNotFoundException;
4.型別轉換異常:ClassCastException;
5.IO異常:IOException;

`1.JVM處理異常的過程:


1.程式執行到出錯的那一行程式碼時,JVM建立了一個異常物件:new ArrayIndexOutOfBoundsException(5);
2.JVM會把異常物件丟擲給這一行程式碼所在的方法:printArray(int[] iArray);
3.由於printArray方法沒有處理異常,所以這個方法會把異常拋給方法的呼叫者main方法;
4.main方法接收到異常物件後也沒有處理,所以main方法把異常物件拋給它的呼叫JVM;
5.JVM接收到異常之後,列印異常資訊,結束程式的執行;


2.自己在程式中建立異常物件並丟擲

1.確定出錯的那一行程式碼;
2.在滿足某個條件後,建立異常物件:
new 異常類名(異常的描述資訊);
3.使用throw關鍵字把剛才建立的異常對昂向外丟擲:
throw new 異常類名(異常的描述資訊);





4.處理異常

第一種處理方法:

捕獲式處理:

使用try{}catch{}程式碼塊包裹住可能會出現異常的程式碼.

    格式1:
/*
* 第一種處理方式的格式:
* try{
* 可能會出現異常的程式碼;
*   }catch(異常類名 異常的物件名){
*      處理異常的程式碼;
*   }

*/
 
示例程式碼:
public static void printArray(int[] iArray){

System.out.println(iArray[0]);
// 捕獲處理異常
try{
// 可能會出現異常的程式碼
   System.out.println(iArray[5]);
   System.out.println("我是也是try裡面的程式碼....");
}catch(ArrayIndexOutOfBoundsException e){
// 處理異常的程式碼;
System.out.println("陣列的長度不能小於6!");
}

// try..catch語句之後的程式碼,在捕獲住異常之後,會繼續被執行
System.out.println("程式要沒有結束..try..catch語句之後的程式碼..");
}


 
格式2:
/*
* 第二種處理方式的格式:
* try{
* 可能會出現異常的程式碼;
*   }catch(異常類名 異常的物件名){
*      處理異常的程式碼;
*   }finallay{
 
    不管程式是否丟擲異常,都必須要執行的程式碼寫在這個位置;
     }
}

*/
 
 
  不管try程式碼塊中的程式是否丟擲異常,finally程式碼塊中的程式都會被執行;
  
示例程式碼:
public static void main(String[] args) {
FileWriter fw = null;
try{
// 可能會出現異常的程式碼
fw = new FileWriter("D://a.txt");
// 如果上面一行丟擲異常,下面這行程式碼將不會被執行
fw.write("hello");
}catch(IOException e){
System.out.println("檔案找不到或者寫入資料錯誤!");
}finally{
// 不管try程式碼塊中的程式是否丟擲異常,finally程式碼塊中的程式都會被執行;
System.out.println("finally程式碼塊...");
try {
fw.close();
}catch (NullPointerException e) {
System.out.println("空指標異常!");
}catch (IOException e) {
System.out.println("IOException!");
}
}
// 上面的異常如果被捕獲住了,下面的程式碼會繼續被執行
System.out.println("try...catch..finally語句之後的程式碼....");
}


捕獲處理的好處:

可以自己捕獲和處理異常,並讓try...catch..語句之後的程式碼繼續執行;




第二種處理方式:
宣告式處理:

在方法的小括號後面使用throws 關鍵字,把方法中可能會丟擲的異常類名列出來,多個異常類名之間用逗號隔開;

格式:

修飾符 返回值型別 方法名(引數列表) throws 異常名1,異常名2...{
方法體;
}

意思是告訴這個方法的呼叫者必須處理宣告出來的異常;

示例程式碼:
public static void method03() throws IOException,NullPointerException{

FileWriter fw = null;
fw = new FileWriter("S://a.txt");
fw.write("hello");
fw.close();
}


3.自定義常


因為JDK中提供的異常類不能滿足我們的需要,或者異常的類名太長,或者不好學習,所以我們要自定義異常類;
 
如何自定義異常呢?

jdk定義異常的特點:
1.寫一個類,繼承異常類(既可以是Throwable類,也可以是它的子類);
2.在類中定自己的構造方法;
3.在自己的構造方法中呼叫父類的構造方法;


自定義異常,按照jdk的定義方式:
1.寫一個類,繼承異常類(既可以是Throwable類,也可以是它的子類);
2.在類中定自己的構造方法;
3.在自己的構造方法中呼叫父類的構造方法;

示例程式碼:
//1.寫一個類,繼承異常類(既可以是Throwable類,也可以是它的子類);
public class NoAgeException extends RuntimeException{


// 2.在類中定自己的構造方法;
public NoAgeException(){


//3.在自己的構造方法中呼叫父類的構造方法;
super();
}

public NoAgeException(String message){
//3.在自己的構造方法中呼叫父類的構造方法;
super(message);
}
}

使用自定義異常:

1.建立異常物件;
2.使用throws關鍵字丟擲;

示例程式碼:

public class Person {
....

public void setAge(int age) {

if(age > 150 || age < 0){
throw new NoAgeException("年齡不能大於150,不能小於0!");
}
this.age = age;
}

....


}