Object-異常聲明及捕獲-自定義異常

一.Object類

Object類是最頂端的類,其它類都是它的子類,它的方法可以被繼承.如果定義的類沒有繼承別的類,那它的直接父類就是Object.如果方法參數類型爲object類型,

則調用方法可以傳遞任意類型的值(相當於多態);同理,如果方法返回值爲Object類型,那麼給方法的返回數據值爲任意類型.

兩種常用方法:toString()/equals()

(1)toString方法

源碼:

public String toString(){
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

覆寫前直接打印對象p1,與p1.toString()打印的結果都是地址值,所以需要重寫toString方法,使其能夠輸出所有成員變量的值.

(2)equals方法

源碼:

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

對於原始方法來說比較的是兩個對象的地址.


代碼:

//覆寫toString()
class Person{
private String name;
private int age;
public Person(String name, int age){
this.name = name;
this.age = age;
}
public String getName(){
return this.name;
}
public int getAge(){
return this.age;
}
@Override
public String toString(){
StringBuilder sb = new StringBuilder();
sb.append("name:").append(this.name).append("\t").append("age:").append(this.age);
return sb.toString();
} 
@Override
public boolean equals(Object obj){
//首先判斷地址值,地址值相等則一定是同一對象
if(this == obj){
return true;
}
//然後判斷是否是同一類,若不是同一類,則必定不相等
if(!(obj instanceof Person)){
return false;
}
//如果是同一類,則比較其屬性,屬性相同,則爲同一事物
Person p = (Person) obj;
if(this.name == p.name && this.age == p.age){
return true;
}else{
return false;
}
}
}


public class PersonDemo{
public static void main(String[] args){
Person p = new Person("zhangsan",20);
Person p1 = new Person("zhangsan",20);
Person p2 = new Person("zhangsan1",20);
System.out.println(p);
System.out.println(p.equals(p1));
System.out.println(p.equals(p2));
}
}


二.try--catch--finally

(1)異常概念及種類

異常是程序中出現的問題,可以把異常封裝成java中的類.java中異常的根類是Throwable.下面分爲兩個子類:Error和Exception.

Error:嚴重問題,需修改代碼才能解決.一般指與虛擬機相關的問題,如系統崩潰/虛擬機錯誤/動態鏈接失敗等

Exception:一般問題,可能會出現.一旦出現簡單處理即可(??).如IOException.一般說的異常指Exception,包括Checked異常和Runtime異常.

目前遇到的異常有如下幾種:

NumberFormatException  數字格式化異常

ArithmeticException 算術異常

ArrayIndexOutOfBoundsException  數組超出綁定異常:沒有輸入參數,或輸入的參數不夠

NullPointerException 空指針異常:使用了未實例化的對象

NoSuchMethodError:main  找不到主方法

ClassCastExeption:A 類轉換異常

IllegalThreadStateException:非法的線程狀態異常

IOException: IO流異常


(2)異常的處理方式

異常處理方式:捕獲處理:try--catch--finally 和 聲明拋出處理 throws


(3)jvm處理異常的過程

jvm處理異常的過程:

1.程序出錯,創建異常對象

2.拋出異常

3.處理異常:捕獲處理和聲明拋出處理


(4)拋出異常-throw:

throw用在方法內,用來拋出一個異常對象,將這個異常對象傳遞到調用者處,並結束當前方法的執行.

格式: throw new 異常類名(參數);

代碼:

class ArrayTools{
public static int getElement(int[] arr, int index){
if(arr == null){
throw new NullPointerException("arr指向的數組不存在");
}
if(index < 0 || index >= arr.length){
throw new ArrayIndexOutOfBoundsException("錯誤的角標"+index+"索引在數組中不存在");
}
int element = arr[index];
return element;
}
}
public class ExceptionDemo{
public static void main(String[] args){
int[] arr = {1,2,3};
//int num = ArrayTools.getElement(null,2);//ExceptionDemo.java:21
int num1 = ArrayTools.getElement(arr,5);//ExceptionDemo.java:22
//System.out.println("num="+num);
System.out.println("num1="+num1);
}
}

控制檯顯示:

[Exception in thread "main" java.lang.NullPointerException: arr指向的數組不存在

at ArrayTools.getElement(ExceptionDemo.java:5)

at ExceptionDemo.main(ExceptionDemo.java:21)]

[Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 錯誤的角標5索引在數組中不存在

at ArrayTools.getElement(ExceptionDemo.java:9)

at ExceptionDemo.main(ExceptionDemo.java:22)]



(5)聲明異常(throws):定在方法聲明的後面,告訴方法的調用者去處理異常,一般用於Checked異常

如果方法內拋出了Checked異常,而沒有捕獲處理,那麼必須通過throws進行聲明,讓調用者去處理.

格式: 修飾符 返回值類型 方法名(參數) throws 異常類名1,異常類名2

代碼:

//import java.io.*;
import java.io.FileReader;
import java.io.FileNotFoundException;
import java.io.IOException;
public class ExceptionTest{
public static void main(String[] args) throws FileNotFoundException,IOException{
FileReader fr = new FileReader("a.txt");//ExceptionTest.java:8
int c = fr.read();
System.out.println(c);
}
}

控制檯顯示:

[Exception in thread "main" java.io.FileNotFoundException: a.txt (系統找不到指定的文件。)

at java.io.FileInputStream.open0(Native Method)

at java.io.FileInputStream.open(FileInputStream.java:195)

at java.io.FileInputStream.<init>(FileInputStream.java:138)

at java.io.FileInputStream.<init>(FileInputStream.java:93)

at java.io.FileReader.<init>(FileReader.java:58)

at ExceptionTest.main(ExceptionTest.java:8)]


(6)捕獲異常:

eclipse快捷鍵 alt shift z

格式:

try{

可能會出現異常的代碼

}catch(異常類名 異常對象名){

處理異常的代碼一; 

使用異常對象打印異常信息;

}finally{

絕對執行的代碼塊;

(一般用來釋放資源)

}

代碼:
import java.io.IOException;
import java.io.FileReader;
public class TryTest{
public static void main(String[] args){
FileReader fr = null;
try{
int c = fr.read();  //TryTest.java:8
System.out.println(c);
}catch(IOException e){
System.out.println("讀取文件時出現了異常");
}finally{
if(fr != null){
try{
fr.close();
}catch(IOException e){
System.out.println("關閉流時出現了問題");
}
}
}
}
}

控制檯顯示:

[Exception in thread "main" java.lang.NullPointerException

at TryTest.main(TryTest.java:8)]


(7)異常注意事項:

1)try中創建的變量只能在try代碼塊中使用,出try後面的代碼塊即無效,局部變量.

2)捕獲代碼後,finally花括號後的代碼將繼續執行.

3)打印異常方法:e.printStackTrace().

4)方法中已經出現返回語句返回值A,再在finally中修改A值,則最終的返回值仍爲修改前A的值。但在該方法中A的值已經被修改了.

代碼:



5)一次捕獲一次處理 catch大異常/一次捕獲多次處理  多個catch/多次捕獲多次處理 多個try-catch

6)先處理小異常,再處理大異常

7)除非在try或catch塊中執行了退出虛擬機的方法(System.exit(1)),否則,無論try或catch中執行怎樣的代碼,finally中的語句一定會執行.

8)關於return:

當java程序執行到try/catch塊中的return或throw語句時,會先去尋找finally塊中是否也含有return或throw等結束方法的語句,如果有則執行finally

塊中的return或throw語句,並且終止方法,不再執行任何語句;

如果finally塊中沒有結束方法的語句,剛程序返回try/catch塊中執行其return等語句,並終止方法.



三.自定義異常

1.讓自定義的類繼承異常類(是Throwable或其子類)

如果繼承的父類是編譯時異常,則拋出後需要調用方法處理.

如果繼承的父類是運行時異常,不需要處理

2.在自定義的類裏添加構造方法,在構造方法調用父類的構造方法.


//自定義異常舉例

class NoAgeException extends Exception{
NoAgeException(){
super();
}
NoAgeException(String message){
super();
}
}
class Person{
private String name;
private int age;
Person(String  name, int age) throws NoAgeException{
if(age <  0 || age > 200){
throw new NoAgeException("年齡數值非法");
}
this.name = name;
this.age = age;
}
public String toString(){
return "name="+name+"age="+age;
}
}
public class ExceptionDemoTest{
public static void main(String[] args){
try{
Person p  = new Person("xiaoming", 20);
System.out.println(p);
}catch(NoAgeException ex){
System.out.println("年齡異常");
}
System.out.println("over");
}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章