(JAVA)-异常

异常就是代表程序出现的问题

Error:

代表系统级别错误,系统一旦出现问题,sun公司会把这些错误封装跟我们程序员没关系

Expection:

叫做异常,代表程序可能出现的问题。通常用他和他的子类来封装程序中出现的问题

编译时异常:编译阶段就会出现异常提醒。(提醒程序员检查本地信息,告诉程序员如果有问题会出这个异常)在编译阶段必须要手动进行异常处理,否则代码报错。

运行时异常:RuntimeException及其子类,编译阶段不会出现异常提醒。运行时出现的异常。

编译阶段不需要处理的,是代码运行时出现的异常。

异常的作用:

一:异常是用来查询bug的关键信息

如上图,第一行的是异常的信息,at后面跟的是异常所在的位置

二:异常可以作为方法内部的一种特殊返回值,以便通知调用者底层执行情况

异常的处理方式:

1.try-catch-finally捕获异常自己处理

当代码出现异常,能进行处理并接着往下运行下去。

格式:try{可能出现异常的代码}catch(异常 e){处理的方案}fianally{一定被执行}

例子:

inr arr[5]{1,2,3,4,5};
System.out.println(arr[10]);//索引越界出错
System.out.println("1");//不执行
//修改后

inr arr[5]{1,2,3,4,5};
try
{System.out.println(arr[10]);//索引越界出错
System.out.println("2");//不执行
}
catch(ArrayIndexOutOfBoundsExpection e){
System.out.println("3");执行
}
finally{
Sys.out.println("4")//finally块中的代码一定执行,除非虚拟机停止
}
System.out.println("5");//执行

运行时异常处理流程:

1.出现了异常,则会在当前代码行创建一个异常对象。

2.跳过当前代码行后面的代码。

3.拿着这个异常对象在本方法内找catch括号中进行比对,看括号中是否能接收

4.接收成功,则执行catch中对应的代码执行完毕,并执行try-catch体系下面的代码

5.接收不成功,默认把异常往上抛出,直到有方法内有对应的Try catch能处理

5.一直处理不成功抛到JVM处理异常 

编译时异常:

编译时异常会在编译时期就报错,异常必须处理,不会默认往上抛出,需要手动通过throws向上抛出

jvm默认处理方案

(1)把异常的名称,异常原因及异常出现的位置输出在了控制台

(2)程序停止执行,下面的代码不会再执行了

2.抛出异常 throw, throws,让方法调用者去处理

throws写在方法定义处,表示声明一个异常,告诉调用者,使用本方法可能会有哪些异常。

编译时异常必须要用throws声明,如果当前处理者不想或无法处理当前问题,可以使用throws继续向上抛出,直至被调用者或系统JVM处理。

throw写在方法内,结束方法,手动向上抛出异常对象,交给调用者,方法中下面的代码不再执行

解疑:

1.当出现多个异常,可以用多个catch捕获,对比顺序依上至下,因此父类需要写在子类异常下面,JDK7之后可以使用符号进行catch中异常对象合并

异常中的常见方法

自定义异常:为了让报错信息更见名知意

public class NameFormatExpection extends RuntimeExpection{
public NameFormatException{}

public NameFormatException(String message){
super(message);   
}

}

Try-Catch-Finally块的执行流程

FInally代码块是一定会执行的,我们来看看到底是在什么时候执行

    public static int test(){
        try
        {
            System.out.println("try");
            return 1;
        }
        catch (Exception e){
            System.out.println("catch");
        }
        finally {
            System.out.println("finally");
        }
        return 3;
    }

可以看到,在try的return方法之前执行了finally块的方法。

    public static int test(){
        try
        {
            System.out.println("try");
            return 1;
        }
        catch (Exception e){
            System.out.println("catch");
        }
        finally {
            System.out.println("finally");
            return 3;
        }
    }

  public static int test(){
        try
        {
            System.out.println("try");
            throw new RuntimeException();
        }
        catch (Exception e){
            System.out.println("catch");
            return 1;
        }
        finally {
            System.out.println("finally");
            return 3;
        }
    }

综上,不管在try块还是catch块中碰到了return语句。都会在执行return语句之前去访问finally块代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值