Object类-try-catch-finally-throw-throws-自定义异常
一.Object類
???? Object類是最頂端的類,其它類都是它的子類,它的方法可以被繼承.如果定義的類沒有繼承別的類,那它的直接父類就是Object.如果方法參數(shù)類型為object類型,
則調(diào)用方法可以傳遞任意類型的值(相當于多態(tài));同理,如果方法返回值為Object類型,那么給方法的返回數(shù)據(jù)值為任意類型.
???? 兩種常用方法:toString()/equals()
(1)toString方法
源碼:
public String toString(){
???????? return getClass().getName() + "@" + Integer.toHexString(hashCode());
???? }
覆寫前直接打印對象p1,與p1.toString()打印的結(jié)果都是地址值,所以需要重寫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)異常概念及種類
???? 異常是程序中出現(xiàn)的問題,可以把異常封裝成java中的類.java中異常的根類是Throwable.下面分為兩個子類:Error和Exception.
Error:嚴重問題,需修改代碼才能解決.一般指與虛擬機相關的問題,如系統(tǒng)崩潰/虛擬機錯誤/動態(tài)鏈接失敗等
Exception:一般問題,可能會出現(xiàn).一旦出現(xiàn)簡單處理即可(??).如IOException.一般說的異常指Exception,包括Checked異常和Runtime異常.
???? 目前遇到的異常有如下幾種:
???????? NumberFormatException? 數(shù)字格式化異常
???????? ArithmeticException 算術(shù)異常
???????? ArrayIndexOutOfBoundsException? 數(shù)組超出綁定異常:沒有輸入?yún)?shù),或輸入的參數(shù)不夠
???????? NullPointerException 空指針異常:使用了未實例化的對象
???????? NoSuchMethodError:main? 找不到主方法
???????? ClassCastExeption:A 類轉(zhuǎn)換異常
???????? IllegalThreadStateException:非法的線程狀態(tài)異常
???????? IOException: IO流異常
(2)異常的處理方式
???? 異常處理方式:捕獲處理:try--catch--finally 和 聲明拋出處理 throws
(3)jvm處理異常的過程
???? jvm處理異常的過程:
???????? 1.程序出錯,創(chuàng)建異常對象
???????? 2.拋出異常
???????? 3.處理異常:捕獲處理和聲明拋出處理
(4)拋出異常-throw:
throw用在方法內(nèi),用來拋出一個異常對象,將這個異常對象傳遞到調(diào)用者處,并結(jié)束當前方法的執(zhí)行.
格式: throw new 異常類名(參數(shù));
代碼:
控制臺顯示:
[Exception in thread "main" java.lang.NullPointerException: arr指向的數(shù)組不存在
???? at ArrayTools.getElement(ExceptionDemo.java:5)
???? at ExceptionDemo.main(ExceptionDemo.java:21)]
[Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 錯誤的角標5索引在數(shù)組中不存在
???? at ArrayTools.getElement(ExceptionDemo.java:9)
???? at ExceptionDemo.main(ExceptionDemo.java:22)]
(5)聲明異常(throws):定在方法聲明的后面,告訴方法的調(diào)用者去處理異常,一般用于Checked異常
如果方法內(nèi)拋出了Checked異常,而沒有捕獲處理,那么必須通過throws進行聲明,讓調(diào)用者去處理.
格式: 修飾符 返回值類型 方法名(參數(shù)) throws 異常類名1,異常類名2
代碼:
控制臺顯示:
[Exception in thread "main" java.io.FileNotFoundException: a.txt (系統(tǒng)找不到指定的文件。)
???? 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{
???????????? 可能會出現(xiàn)異常的代碼
???????? }catch(異常類名 異常對象名){
???????????? 處理異常的代碼一;
???????????? 使用異常對象打印異常信息;
???????? }finally{
???????????? 絕對執(zhí)行的代碼塊;
???????????? (一般用來釋放資源)
???????? }
代碼:
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("讀取文件時出現(xiàn)了異常"); 12 }finally{ 13 if(fr != null){ 14 try{ 15 fr.close(); 16 }catch(IOException e){ 17 System.out.println("關閉流時出現(xiàn)了問題"); 18 } 19 } 20 } 21 22 } 23 } 24
控制臺顯示:
[Exception in thread "main" java.lang.NullPointerException
???? at TryTest.main(TryTest.java:8)]
(7)異常注意事項:
???? 1)try中創(chuàng)建的變量只能在try代碼塊中使用,出try后面的代碼塊即無效,局部變量.
???? 2)捕獲代碼后,finally花括號后的代碼將繼續(xù)執(zhí)行.
???? 3)打印異常方法:e.printStackTrace().
???? 4)方法中已經(jīng)出現(xiàn)返回語句返回值A,再在finally中修改A值,則最終的返回值仍為修改前A的值。但在該方法中A的值已經(jīng)被修改了.
???? 代碼:
???? 5)一次捕獲一次處理 catch大異常/一次捕獲多次處理? 多個catch/多次捕獲多次處理 多個try-catch
???? 6)先處理小異常,再處理大異常
???? 7)除非在try或catch塊中執(zhí)行了退出虛擬機的方法(System.exit(1):非零為非正常退出),否則,無論try或catch中執(zhí)行怎樣的代碼,finally中的語句一定會執(zhí)行.
???? 8)關于return:
???? 當java程序執(zhí)行到try/catch塊中的return或throw語句時,會先去尋找finally塊中是否也含有return或throw等結(jié)束方法的語句,如果有則執(zhí)行finally
???? 塊中的return或throw語句,并且終止方法,不再執(zhí)行任何語句;
???? 如果finally塊中沒有結(jié)束方法的語句,剛程序返回try/catch塊中執(zhí)行其return等語句,并終止方法.
三.自定義異常
???? 1.讓自定義的類繼承異常類(是Throwable或其子類)
???????? 如果繼承的父類是編譯時異常,則拋出后需要調(diào)用方法處理.
???????? 如果繼承的父類是運行時異常,不需要處理
???? 2.在自定義的類里添加構(gòu)造方法,在構(gòu)造方法調(diào)用父類的構(gòu)造方法.
//自定義異常舉例
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("年齡數(shù)值非法"); 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轉(zhuǎn)載于:https://www.cnblogs.com/huguangqin/p/7124047.html
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的Object类-try-catch-finally-throw-throws-自定义异常的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UI-2
- 下一篇: Python即Python解释器的发展史