Java基础之异常
在程序运行的过程中,可能会因为外部不可预料的因素而导致某个方法的执行失败,称之为异常,而Java有自己的异常机制。
异常处理机制
:
try{
老王.开车();
}catch(撞车 e){
e.get车主().赔钱();
医生.抢救(老王);
}
老王.吃饭();
我们将可能会出现意外情况的语句用try-catch语句包围起来,如果没有出现意外,程序正常执行,如果出现意外,程序进入catch中的处理语句中,处理完后继续往下执行。
class T{
static void t(){
int a = 2/0; print(0);
}
public static void main(String s[]){
try{
t();
}catch(Exception e){
print(1);
}
print(2);
运行结果:1 2
运行时异常—-编译能通过,但是一运行就终止了,程序不会处理运行时异常,出现这类异常,程序会终止;
受检查时异常—-要么用try。。。catch来捕获,要么用throws字句声明抛出,交给它的父类处理,否则编译不通过。
Throwable 具有两个子类
A. Exception:处理用户程序应当捕获的异常情况,即表示程序可以处理的
B. Error:Error 类的异常为内部错误,一般是与JVM相关的问题,如:JVM异常,内存不足,系统崩溃等,在正常情况下不期望用户的程序捕获它们
多重catch块
一段代码可能会生成多个异常
当引发异常时,会按顺序来查看每个 catch 语句,并执行第一个类型与异常类型匹配的语句
执行其中的一条 catch 语句之后,其他的 catch 语句将被忽略
try{
…….
} catch(ArrayIndexOutOfBoundsException e) {
……
} catch(Exception e) {
……
}
【注意】使用多重 catch 语句时,异常子类一定要位于异常父类之前
如:
try{
…...
} catch(Exception e) {
……
} catch(ArrayIndexOutOfBoundsException e) {
……
}//错误写法
用户自定义异常
Java API提供的内置异常不一定总能准确描述程序的错误类型,有时还需要用户自已定义异常类
自定义异常需要继承Exception或其子类
class T extends Exception{
}
如:
public class InvalidPhoneException extends Exception{
private String phone;
public InvalidPhoneException (String phone){
this.phone = phone;
}
public String getMessage(){
return “无效的电话号码[”+phone+”]”;
}
public String getPhone(){
return phone;
}
}
class TestException{
static void checkPhone(String phone) throws InvalidPhoneException {
if(phone==null || phone.trim().length()<7){
//假设长度小于7就是非法的电话号码
throw new InvalidPhoneException (phone);
}
}
}
//throw是具体向外抛出异常的动作,所以它是抛出一个异常实例即异常对象,throws声明这个方法会抛出这种类型的异常,使它的调用者知道要捕获这个异常,所以它后面跟的是异常类型
使用throw和throws
throws
用于定义方法可能会抛出的异常,后面跟异常的类名。当一个方法可能会抛出多个异常时,异常类间用逗号进行分隔
Eg: void t() throws ExceptionA, ExceptionB{}
注意:仅是定义可能抛出,而不是一定会抛出异常。
throw
用于抛出异常对象,后面跟创建的异常对象
Eg:throw new Exception();
finally
如果存在这样的代码:
无论try代码块中的语句是否会产生异常,这段代码都希望被执行,即使写了return也会执行,我们可以把这样的代码放到finally代码块中。
class T{
void t(){
try{
int a = 1/0;
}catch(Exception e){
}finally{
//不管try中的语句是否会产生异常,这里的代码总是会执行,即使try中使用了return
}
}
上一篇: python异常定义与原理
下一篇: Java异常处理