1.運行時異常與一般異常(檢查異常)的異同
異常表示程序運行過程中可能出現的非正常狀態,運行時異常表示虛擬機的通常操作中可能遇到的異常,是一種常見的運行錯誤。Java編譯器要求方法必須聲明跑出可能發生的非運行時異常,但是並不要求必要聲明跑出位被捕獲的運行時異常。
2.異常的處理方法:
方法一:try/catch(捕獲處理):
注意,當try中的某條語句引發異常後,程序立即跳轉到catch部分,查找和該異常類型相匹配的catch語句並執行catch{}中的所有語句,而位於try中的發生異常語句後面的所有語句(正常語句和會發生異常的語句)都不會執行。
如果有finally語句,無論是否有匹配的catch語句,也無論是否發生了異常,程序最終都會轉到finally中來執行。
在java中,try和catch可以連用,try catch finally可以連用。但是try catch finally卻不可以單獨使用。如果在程序中只想try而不去catch也是可以的,但是try的後面必須跟有finally。例如下面題目:
關於捕獲異常的語法描述,請選擇正確答案
A。try可以單獨使用
B、try catch必須配對使用
C。try finally可以配對使用
D。catch finally可以配對使用
E。在try catch之後如果定義了finally,則finally肯定執行
答案CE
方法二:throws(聲明異常)
聲明異常是指一個方法不處理它產生的異常,而是向上傳遞,誰調用這個方法,這個異常就由誰來處理。
如果要讓下面的程序正常編譯,需要對子類ThrowDemo中的重寫方法myThow()做怎麼的處理?
番外篇:java中子類重寫父類方法時,返回類型要不要一樣纔算重寫啊?
我見過兩種版本啊,有的書上說要一樣,有的書上說返回類型可以不同啊!
哎!! 到底怎麼樣啊? 高手解釋,解釋!謝謝了!!
重寫:除了方法體裏面的代碼,其他的部分都要和父類中的一樣(訪問權限要比父類中定義的訪問權限寬鬆,如父類中定義爲public,那子類重寫的方法也必須是public,不能是protected或者private)。
樓上說法不準確:重載方法區別在於參數個數和參數類型,不在於返回值。也就是,重載方法的返回值可以不一樣,而重寫方法的返回值必須一樣。
給你總結區分一下:重寫方法出現在子類中,只有在發生繼承關係的前提下,在能出現重寫方法,而且重寫的是父類的方法。而重載方法出現在同一個類中,和繼承沒有關係,重載的是類自己的方法。
吼吼,基礎還要繼續加強嘍,偶也分不清重寫重載啦,以上百度說的很明白啦,學習了,接着學習異常
public class ThrowDemo extends Throw{
void myThrow/* throws 表達式*/{
try{
myThow_1(7,0);
}catch(ArithmeticException e){
System.out.println();
}
throw new RuntimeException("運行時異常");
}
public static void main(String[] args){
new ThrowDemo.myThow();
}
}
class Throw{
void myThow()throws ArithmeticException, InterrupteException{
myThow_1(3,6)
}
int myThow_1()throws ArithemeticException{
return x/y;
}
}
A. 在myThow()後面需要聲明ArithemeticException
B. 在myThow()後面需要聲明InterrupteException
C. 在myThow()後面需要聲明RuntimeException
D. 在myThow()後面需要聲明ArithemeticException,A. 又要聲明InterrupteException
E. 在myThow()後面不要需要聲明任何異常並將throw new RuntimeException("運行時異常");這條語句去掉
分析:
父類中的重寫方法可以指定所有的已檢查異常或者指定已檢查異常的一部分,這些已檢查異常是重載方法在其throws子句中聲明的。子類在重寫該方法時不需要指定重寫方法throws子句的任何已檢查異常。所以本題中myThow()方法不用做任何的聲明ArithemeticException和InterrupteException都是RuntimeException,並且在myThow()方法中捕獲處理異常,所以不應該再拋出異常。答案E
方法三:throw
當一方法發生異常時可以通過throw關鍵字來拋出異常,把異常拋給它上一級的調用者,拋出的可以shi異常引用,也可以是異常對象,它的語法格式如下:
throw 異常對象名;
或者
throw new 異常類名();
一條throw語句一旦被執行,程序立即轉入相應的異常處理程序段,他後面的語句就不再執行了(這一點類似於return語句),而且它所在的方法也不再返回有意義的值。在一個方法中,throw語句可以有多條,但是每一次最多隻能執行其中一條。在一般情況下,throw語句都會寫在判斷語句塊中,以避免每次都執行該語句。
//代碼剖析
public class catchThows{
static int x;
public static void main(String[] args){
double a = Math.random()*10;
if(x>0){
System.out.println(a/x);
}else{
throw new Exception;//拋出異常
}
}
}
public void setX(int x){
this.x = x;
}
從上面的運行結果可以看出,一個方法中如果使用throw來拋出異常,要麼自己捕獲它,要麼聲明拋出了一個異常。要聲明拋出了異常,需要用throws關鍵字在方法的頭部聲明。如果我們將上面的代碼修改成下面的代碼,那麼結果有會怎麼樣呢?
public class catchThows_1{
static int x;
public static void main(String[] args){
double a = Math.random()*10;
if(x>0){
System.out.println(a/x);
}else{
try{
throw new Exception();//拋出異常
}catch(Exception e){
System.out.println("出現異常的原因是:"+e.getMessage());
}
}
}
public void setX(int x){
this.x = x;
}
}
運行結果如下:
出現異常的原因是:null
還有一種拋出異常的方法是讓被調用的方法表示它將不處理異常,該異常將被拋出到他 的調用方法中。這點是和throws聲明異常很相似的,但是他們的文職完全不同。具體代碼如下:
public class catchDemo{
void findThows(){
try{
//拋出方法
throw new ArithmeticException();
}catch(ArithmeticException ae){
throw ae;
}
}
public static void main(String[] args){
catchDemo ct = new catchDemo();
//對方法進行異常處理
try{
ct.findThows();
}catch(ArithmeticException ae){
System.out.println(" 出現異常的原因是:"+ae);
}
}
}
運行結果如下、
出現異常的原因是:java.lang.ArithmeticException