java中throws子句是怎么用的?工作原理是什么?
throws子句
馬克-to-win:當(dāng)你的方法里拋出了checked異常,如你不catch,代表你當(dāng)時(shí)不處理(不想處理或沒(méi)條件處理),但你必須得通過(guò)"throws 那個(gè)異常"告訴系統(tǒng)說(shuō),這兒有個(gè)問(wèn)題,我現(xiàn)在不處理,將來(lái)一定別人要處理,否則執(zhí)行到它,馬克-to-win:系統(tǒng)會(huì)"不優(yōu)雅"的崩潰。舉個(gè)例子,工兵張三發(fā)現(xiàn)了地雷,假如他處理,完事就完事兒了。但是他發(fā)現(xiàn)了地雷,自己卻沒(méi)帶齊工具,沒(méi)法處理,他必須做個(gè)標(biāo)記,說(shuō)這兒有一個(gè)地雷,別的工兵將來(lái)一定要處理,否則將來(lái)有人踩上去會(huì)爆炸。馬克-to-win:注意:throws只是標(biāo)記,并沒(méi)處理,執(zhí)行到那,系統(tǒng)還是會(huì)崩潰!
馬克- to-win:馬克 java社區(qū):防盜版實(shí)名手機(jī)尾號(hào): 73203。
馬克-to-win:語(yǔ)法總結(jié)就是:當(dāng)你的方法里拋出了checked異常,如你不catch,必須throws,即告訴編譯器,我的調(diào)用者會(huì)處理。如果你已經(jīng)是main,則main的調(diào)用者jvm會(huì)替你收拾殘局。否則無(wú)法編譯通過(guò)。
馬克-to-win:有的同學(xué)可能會(huì)問(wèn):throws有什么意義?又不真正處理問(wèn)題。throws的意義,在于和throw配合起來(lái)一起工作。有關(guān)throw的意義,請(qǐng)參照上面throw部分。
馬克-to-win:現(xiàn)在就出現(xiàn)了一個(gè)非常深入的問(wèn)題。(新手可忽略)為什么sun公司的語(yǔ)法設(shè)計(jì)成:runtime異常不需要throws,而非 runtime異常需要呢?咱們先說(shuō)非runtime異常為什么需要throws呢?因?yàn)槌绦騿T多一道工序宣稱一下,麻煩一下自己,會(huì)給sun公司的人(Java編譯器)提供很大便利,少了很多判斷等工作。說(shuō)穿了就是麻煩我們自己方便他人。而為什么runtime異常不需要throws呢?因?yàn)檫\(yùn)行時(shí)的情況非常復(fù)雜,程序員實(shí)在無(wú)法預(yù)料到所有的情況到底除零還是格式不對(duì),所以即使想幫也幫不上忙。sun公司的人沒(méi)有辦法,只能自己去判斷,即使再不愿意,也得干。于是也就不用你throws了。下面一段話摘自國(guó)外程序員和sun公司的對(duì)話:有關(guān)抱怨sun公司強(qiáng)迫他們寫throws的,認(rèn)為是個(gè) burden。挺有意思,大家可以看看。事兒(需要throws)都是programmer干的,出了問(wèn)題,責(zé)任也是你的。
馬克-to-win:拿上一節(jié),1.6.2為例,當(dāng)時(shí)有問(wèn)題,我們用catch解決了,當(dāng)然我們也可以用throws技術(shù)搞定它。
例:1.7.1(本例編譯有錯(cuò)誤)-本章源碼
import java.io.FileNotFoundException;
public class Test {
void m1_mark_to_win() {
throw new FileNotFoundException();
}
}
馬克-to-win:上例編譯有錯(cuò)誤,因?yàn)镕ileNotFoundException是checked異常,所以我們必須加catch馬上處理或用throws留待將來(lái)處理。catch我們這里就不說(shuō)了。馬克-to-win:上節(jié)有論述。我們這里用throws 來(lái)處理。
例:1.7.2(可通過(guò)編譯)-本章源碼
import java.io.FileNotFoundException;
public class Test {
void m1_mark_to_win() throws FileNotFoundException {
throw new FileNotFoundException();
}
}
像下面的子類也可以
例:1.7.2_2(可通過(guò)編譯)-本章源碼
import java.io.*;
public class Test {
void m1_mark_to_win() throws IOException {
throw new FileNotFoundException();
}
}
這里FileNotFoundException是IOException 的子類。
java.lang.Object
java.lang.Throwable
java.lang.Exception
java.io.IOException
java.io.FileNotFoundException
馬克-to-win:注意:例:1.7.2,編譯就沒(méi)問(wèn)題了,但是throws FileNotFoundException,只是標(biāo)記了一下問(wèn)題,并沒(méi)有真正處理,運(yùn)行到throw new FileNotFoundException();時(shí),程序還是會(huì)崩潰。馬克-to-win:不信,下面我們就加一個(gè)主調(diào)方法測(cè)試一下。
例:1.7.3(本例編譯有問(wèn)題)-本章源碼
import java.io.FileNotFoundException;
public class Test {
void m1_mark_to_win() throws FileNotFoundException {
throw new FileNotFoundException();
}
public static void main(String[] args) {
Test t=new Test();
t.m1_mark_to_win();//這句會(huì)報(bào)紅線
System.out.println("馬克-to-win:優(yōu)雅結(jié)束");
}
}
馬克-to-win:例:1.7.3的主調(diào)方法t.m1_mark_to_win();又有問(wèn)題了,因?yàn)楸徽{(diào)方法m1_mark_to_win()里面有一個(gè)沒(méi)有處理的throw異常,所以主調(diào)方法還是編譯不過(guò)。馬克-to-win:我們必須或者catch或者throws處理,catch上一節(jié)講了,現(xiàn)在我們不講。這里我們用throws,等于還是沒(méi)有處理,程序運(yùn)行到這還是會(huì)崩潰。馬克-to-win:下面我們看一下運(yùn)行結(jié)果。
例:1.7.4-本章源碼
import java.io.FileNotFoundException;
public class Test {
void m1_mark_to_win() throws FileNotFoundException {
throw new FileNotFoundException();
}
public static void main(String[] args) throws FileNotFoundException {
Test t=new Test();
t.m1_mark_to_win();
System.out.println("馬克-to-win:優(yōu)雅結(jié)束");
}
}
輸出結(jié)果:
Exception in thread "main" java.io.FileNotFoundException
at Test.m1_mark_to_win(Test.java:4)
at Test.main(Test.java:8)
馬克-to-win:結(jié)果分析:當(dāng)程序運(yùn)行t.m1_mark_to_win();程序崩潰了,連System.out.println("馬克-to-win:優(yōu)雅結(jié)束");都沒(méi)有執(zhí)行。要想不崩潰, 只能加try catch。
例:1.7.5-本章源碼
import java.io.FileNotFoundException;
public class Test {
void m1_mark_to_win() throws FileNotFoundException {
throw new FileNotFoundException();
}
public static void main(String[] args) {
Test t=new Test();
try {
t.m1_mark_to_win();
} catch (FileNotFoundException e) {
System.out.println(e);
}
System.out.println("馬克-to-win:優(yōu)雅結(jié)束");
}
}
輸出結(jié)果:
java.io.FileNotFoundException
馬克-to-win:優(yōu)雅結(jié)束
馬克-to-win:下面的例子1.7.6,多了一層調(diào)用,道理是一樣的, 僅供參考。一直用throws做緩兵之計(jì),沒(méi)有解決問(wèn)題,所以程序最后還是崩潰了!catch才能真正解決問(wèn)題。
例:1.7.6-本章源碼
import java.io.FileNotFoundException;
class Class_mark_to_win
{
void m1_mark_to_win() throws FileNotFoundException {
throw new FileNotFoundException();
}
}
class Class2_mark_to_win
{
void m2_mark_to_win() throws FileNotFoundException {
Class_mark_to_win c=new Class_mark_to_win();
c.m1_mark_to_win();
}
}
public class Test {
public static void main(String[] args) throws FileNotFoundException {
Class2_mark_to_win c2=new Class2_mark_to_win();
c2.m2_mark_to_win();
System.out.println("馬克-to-win:優(yōu)雅結(jié)束");
}
}
輸出結(jié)果:
Exception in thread "main" java.io.FileNotFoundException
at Class_mark_to_win.m1_mark_to_win(Test.java:5)
at Class2_mark_to_win.m2_mark_to_win(Test.java:12)
at Test.main(Test.java:20)