異常:程序出現(xiàn)了沒有足夠信息能繼續(xù)執(zhí)行妻率,或者不能按照正常邏輯執(zhí)行
Java 異常機(jī)制弓千,使得我們能在某個(gè)地方集中處理要解決的問題兵扬。
異常種類:檢查時(shí)異常指蚜,運(yùn)行時(shí)異常
檢查時(shí)異常乞巧,我們必須catch或者拋出,運(yùn)行時(shí)異常不用顯示捕捉摊鸡。
常見運(yùn)行時(shí)異常有:ClassCastException, DateTimeParseException, IllegalArgumentException, ArrayIndexOutOfBoundsException, NullPointerException
等绽媒。
異常的基類是Throwable
, 這個(gè)類有2個(gè)子類蚕冬,一個(gè)是Error
, 另一個(gè)是Exception
。
在實(shí)際中我們需要自定義異常類是辕,可以繼承Exception或者Throwable囤热。
一個(gè)自定義異常的例子:
class CannotOpenException extends Exception{
private static final long serialVersionUID = 4893739257004490618L;
}
public class TextException {
public void throwException() throws CannotOpenException{
System.out.println("do something");
throw new CannotOpenException();
}
public static void main(String[] args) {
try {
new TextException().throwException();
} catch (CannotOpenException e) {
e.printStackTrace();
}finally {
System.out.println("Do some clean up.");
}
}
}
執(zhí)行結(jié)果:
do something
Do some clean up.
CannotOpenException
at TextException.throwException(TextException.java:11)
at TextException.main(TextException.java:16)
有時(shí)候使用不當(dāng),異常會(huì)丟失获三,常見的問題是在finally
執(zhí)行了return
旁蔼。
class CannotOpenException extends Exception{
private static final long serialVersionUID = 4893739257004490618L;
}
public class TextException {
public void throwException() throws CannotOpenException{
try{
System.out.println("do something");
throw new CannotOpenException();
}finally {
return;
}
}
public static void main(String[] args) {
try {
new TextException().throwException();
} catch (CannotOpenException e) {
e.printStackTrace();
}finally {
System.out.println("Do some clean up.");
}
}
}
執(zhí)行結(jié)果:
do something
Do some clean up.
異常的繼承
- 子類可以不用聲明任何異常如果不調(diào)用基類的方法。如果聲明只能是基類的類型疙教。
- 構(gòu)造函數(shù)可以聲明任何異常棺聊,但必須包含基類的異常。
class CannotOpenException extends Exception {
}
class CannotReadException extends Exception {
}
class CannotWriteException extends Exception {
}
abstract class BaseClazz {
public BaseClazz() throws CannotOpenException{
}
public void read() throws CannotReadException {
}
public void write() throws CannotWriteException {
}
}
class SubClazz extends BaseClazz{
public SubClazz() throws CannotOpenException,CannotReadException,CannotWriteException {
//構(gòu)造方法必須包含基類異常贞谓,但是可以拋出其他任何異常
}
@Override
public void read() throws CannotReadException {
super.read();//必須并且只能和基類的異常一樣
}
@Override
public void write() {
//如果不調(diào)用super方法限佩,可以不拋出基本的異常
}
}