異常是什么
異常就是有異于常態(tài)淆院,和正常情況不一樣箫攀,有錯(cuò)誤出現(xiàn)。
異常分類
Error:
是程序中無法處理的錯(cuò)誤树叽,表示運(yùn)行應(yīng)用程序中出現(xiàn)了嚴(yán)重的錯(cuò)誤。此類錯(cuò)誤一般表示代碼運(yùn)行時(shí)JVM出現(xiàn)問題谦絮。
代表異常:VirtualMachineError(虛擬機(jī)運(yùn)行錯(cuò)誤)题诵、NoClassDefFoundError(類定義錯(cuò)誤)、OutOfMemoryError层皱。
此類錯(cuò)誤發(fā)生時(shí)性锭,JVM將終止線程。非代碼性錯(cuò)誤叫胖。因此篷店,當(dāng)此類錯(cuò)誤發(fā)生時(shí),應(yīng)用不應(yīng)該去處理此類錯(cuò)誤臭家。
Exception:
程序本身可以捕獲并且可以處理的異常。又分為不受檢異常方淤、受檢異常
- 運(yùn)行時(shí)異常(不受檢異常):
RuntimeException類極其子類表示JVM在運(yùn)行期間可能出現(xiàn)的錯(cuò)誤钉赁。編譯器不會(huì)檢查此類異常,并且不要求處理異常携茂。
代表異常:NullPointerException)你踩、ArrayIndexOutBoundException。
此類異常屬于不可查異常讳苦,一般是由程序邏輯錯(cuò)誤引起的带膜,在程序中可以選擇捕獲處理,也可以不處理鸳谜。
- 非運(yùn)行時(shí)異常(受檢異常):
Exception中除RuntimeException極其子類之外的異常膝藕。編譯器會(huì)檢查此類異常,如果程序中出現(xiàn)此類異常
代表異常:說IOException
必須對(duì)該異常進(jìn)行處理咐扭,要么使用try-catch捕獲芭挽,要么使用throws語句拋出,否則編譯不通過蝗肪。
異常的處理
拋出異常:throw袜爪,throws
throw
throw用在方法內(nèi),用來拋出一個(gè)異常對(duì)象薛闪,將這個(gè)異常對(duì)象傳遞到調(diào)用者處辛馆,并結(jié) 束當(dāng)前方法的執(zhí)行。
public class DemoThrow {
public static void main(String[] args) {
int a = DemoThrow.div(4,0);
System.out.println(a);
}
public static int div(int a,int b)
{
if(b==0)
throw new ArithmeticException("異常信息:除數(shù)不能為0");//拋出具體問題豁延,編譯時(shí)不檢測(cè)
return a/b;
}
}
throws
運(yùn)用于方法聲明之上昙篙,用于表示當(dāng)前方法不處理異常腊状,而是提醒該方法的調(diào)用者來處理異常
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
public class DemoThrows {
public static void main(String[] args) throws FileNotFoundException{
readFile();
}
public static void readFile() throws FileNotFoundException {
InputStream is = new FileInputStream("E:/iodemo/ch01.txt");
}
}
try代碼塊
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
public class DemoTryCatch {
public static void main(String[] args) {
//捕獲異常
try {
//可能產(chǎn)生異常的代碼
readFile();
} catch (FileNotFoundException e) {
//異常的處理邏輯,將異常記錄日志瓢对,異常封裝后顯示
System.out.println("系統(tǒng)找不到指定的路徑");
}
System.out.println("后續(xù)代碼");
}
public static void readFile() throws FileNotFoundException {
InputStream is = new FileInputStream("E:/iodemo/ch01.txt");
}
}
kotlin異常處理
Kotlin 中所有異常類都是 Throwable 類的子類寿酌。
throw
fun main() {
//sampleStart
throw Exception("Hi There!")
//sampleEnd
}
try
try {
// 一些代碼
}
catch (e: SomeException) {
// 處理程序
}
finally {
// 可選的 finally 塊
}
try表達(dá)式
fun e3(){
val result = try {
throw IllegalArgumentException("exception happen")
}catch (e:Throwable){
println(e.message)
0 //返回最后一行
}finally {
123 //不會(huì)作為返回值,只會(huì)返回try硕蛹、catch最后一行
}
println(result)
}
try-表達(dá)式的返回值是 try 塊中的最后一個(gè)表達(dá)式或者是(所有)catch 塊中的最后一個(gè)表達(dá)式醇疼。 finally 塊中的內(nèi)容不會(huì)影響表達(dá)式的結(jié)果。
受檢的異常
Kotlin 沒有受檢的異常法焰⊙砭#可以理解都是運(yùn)行時(shí)異常。同理AS不會(huì)提醒你要捕捉異常埃仪。
Java
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
kotlin
Thread.sleep(3000)
經(jīng)過了解知道乙濒,不僅僅Thread.sleep不需要獲取異常,像對(duì)文件操作一般需要捕獲的IOException也不需要了卵蛉;
原來kotlin在編譯時(shí)根本不會(huì)檢查你有沒有捕獲異常颁股!
看到這里我也是有點(diǎn)擔(dān)心的,不捕獲異常萬一在運(yùn)行時(shí)拋出異常程序不就崩了嗎傻丝?
其實(shí)很多異常我們是可以預(yù)估到它可能會(huì)發(fā)生并且避免的甘有,比如Thread.sleep的InterruptedException,只有在調(diào)用thrad.interrupt()方法后才會(huì)拋出葡缰,正常情況下并不會(huì)拋出該異常亏掀,但是在java中編譯器卻強(qiáng)制我們要捕獲,讓代碼看起來就很臃腫不夠簡(jiǎn)潔泛释;
而且 java強(qiáng)制要求捕獲異常并沒有降低異常的發(fā)生滤愕,有很多更常見的異常并沒有強(qiáng)制要求捕獲,例如:NullPointerException怜校、ArrayIndexOutOfBoundsException间影、IllegalArgumentException等
kotlin并不是告訴你不要再捕捉異常!對(duì)待異常韭畸,我們還是要養(yǎng)成良好的編碼習(xí)慣宇智,考慮周全一些,在可能拋出異常的地方通過if判斷等方式將其扼殺在搖籃里胰丁;