1. 程式人生 > >Object類-try-catch-finally-throw-throws-自定義異常

Object類-try-catch-finally-throw-throws-自定義異常

pre 類繼承 輸入 解決 uil pri nat check run

一.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);
}
對於原始方法來說比較的是兩個對象的地址.

代碼:

  1 //覆寫toString()
  2  class Person{
  3      private String name;
  4      private int age;
  5 
  6     public Person(String name, int age){
  7          this.name = name;
  8          this.age = age;
  9      }
 10 
 11     public String getName(){
 12          return this.name;
 13      }
 14 
 15
public int getAge(){ 16 return this.age; 17 } 18 19 @Override 20 public String toString(){ 21 StringBuilder sb = new StringBuilder(); 22 sb.append("name:").append(this.name).append("\t").append("age:").append(this.age); 23 return sb.toString(); 24
} 25 26 @Override 27 public boolean equals(Object obj){ 28 //首先判斷地址值,地址值相等則一定是同一對象 29 if(this == obj){ 30 return true; 31 } 32 33 //然後判斷是否是同一類,若不是同一類,則必定不相等 34 if(!(obj instanceof Person)){ 35 return false; 36 } 37 38 //如果是同一類,則比較其屬性,屬性相同,則為同一事物 39 Person p = (Person) obj; 40 if(this.name == p.name && this.age == p.age){ 41 return true; 42 }else{ 43 return false; 44 } 45 46 } 47 } 48 49 50 public class PersonDemo{ 51 public static void main(String[] args){ 52 Person p = new Person("zhangsan",20); 53 Person p1 = new Person("zhangsan",20); 54 Person p2 = new Person("zhangsan1",20); 55 System.out.println(p); 56 System.out.println(p.equals(p1)); 57 System.out.println(p.equals(p2)); 58 } 59 } 60


二.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 異常類名(參數);
代碼:

  1 class ArrayTools{
  2      public static int getElement(int[] arr, int index){
  3 
  4          if(arr == null){
  5              throw new NullPointerException("arr指向的數組不存在");
  6          }
  7 
  8         if(index < 0 || index >= arr.length){
  9              throw new ArrayIndexOutOfBoundsException("錯誤的角標"+index+"索引在數組中不存在");
 10          }
 11 
 12         int element = arr[index];
 13 
 14         return element;
 15      }
 16  }
 17 
 18 public class ExceptionDemo{
 19      public static void main(String[] args){
 20          int[] arr = {1,2,3};
 21          //int num = ArrayTools.getElement(null,2);//ExceptionDemo.java:21
 22          int num1 = ArrayTools.getElement(arr,5);//ExceptionDemo.java:22
 23          //System.out.println("num="+num);
 24          System.out.println("num1="+num1);
 25      }
 26  }
 27 


控制臺顯示:
[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
代碼:

  1 //import java.io.*;
  2  import java.io.FileReader;
  3  import java.io.FileNotFoundException;
  4  import java.io.IOException;
  5 
  6 public class ExceptionTest{
  7      public static void main(String[] args) throws FileNotFoundException,IOException{
  8          FileReader fr = new FileReader("a.txt");//ExceptionTest.java:8
  9          int c = fr.read();
 10          System.out.println(c);
 11      }
 12  }
 13 


控制臺顯示:
[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{
絕對執行的代碼塊;
(一般用來釋放資源)
}

代碼:

  1 import java.io.IOException;
  2  import java.io.FileReader;
  3 
  4 public class TryTest{
  5      public static void main(String[] args){
  6          FileReader fr = null;
  7          try{
  8          int c = fr.read();  //TryTest.java:8
  9          System.out.println(c);
 10          }catch(IOException e){
 11              System.out.println("讀取文件時出現了異常");
 12          }finally{
 13              if(fr != null){
 14                  try{
 15                      fr.close();
 16                  }catch(IOException e){
 17                      System.out.println("關閉流時出現了問題");
 18                  }
 19              }
 20          }
 21 
 22     }
 23  }
 24 


控制臺顯示:
[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.在自定義的類裏添加構造方法,在構造方法調用父類的構造方法.

//自定義異常舉例

  1 class NoAgeException extends Exception{
  2      NoAgeException(){
  3          super();
  4      }
  5 
  6     NoAgeException(String message){
  7          super();
  8      }
  9  }
 10 
 11 class Person{
 12      private String name;
 13      private int age;
 14 
 15     Person(String  name, int age) throws NoAgeException{
 16          if(age <  0 || age > 200){
 17              throw new NoAgeException("年齡數值非法");
 18          }
 19 
 20         this.name = name;
 21          this.age = age;
 22      }
 23 
 24     public String toString(){
 25          return "name="+name+"age="+age;
 26      }
 27  }
 28 
 29 public class ExceptionDemoTest{
 30      public static void main(String[] args){
 31          try{
 32              Person p  = new Person("xiaoming", 20);
 33              System.out.println(p);
 34          }catch(NoAgeException ex){
 35             System.out.println("年齡異常");
 36          }
 37          System.out.println("over");
 38      }
 39  }
 40 

Object類-try-catch-finally-throw-throws-自定義異常