java異常類 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;
}
....
}