Java SE ---- 异常与错误

介绍

        当我们程序出现问题时,我们都希望知道问题出在哪里,为什么出错以便于我们处理问题。这时java中就提出的异常和错误的概念。

        java中,将程序员可以解决的问题称为异常(Exception),这类问题一般都是由程序员主动发起的。

        而程序员无法解决的java虚拟机的问题称为错误(Error),这类问题一般是由java虚拟机发起的。

        作用都是用于主动阻止程序员或者使用程序的人对程序进行会发生重大负面影响的行为。

Throwable类

        是所有错误和异常的超类。java 如果没有继承自Throwable类将无法被称为异常或者错误。他规定了错误以及异常的基本方法。如:

        printStackTrace()方法,将打印问题的信息,Throwable类将问题出现的信息以栈的形式进行存储。该方法将输出,异常类型,异常信息,所有的发生异常位置。

        getMessenge()方法,获取异常信息。

        getCause()方法,获取一条异常发生处的信息,并包装为Throwable类对象。

        。。。

        注意:当我们没有抛出或者处理异常(后面会讲到),编译器将会报错,无法通过编译。

//该方法将会在编译时报错
void f(){
    throw new Throwable();
}

Exception类

        java定义的Throwable类的唯二子类之一,继承Exception的类才可以被称为异常

        RunTimeException类

        java中一类特殊的异常类,表示运行时发生的异常。作为异常他可以不需要我们主动处理,也不需要我们抛出异常,java编译器也允许我们通过。由于是运行时发生的异常,有很高的不确定性。所以java编译器认为检查运行时异常是一件没有必要的事。

Error类

        java定义的Throwable类的唯二子类之一,继承Error的类才可以被称为错误

        错误一般是由java虚拟机发起的。当虚拟机出现内存不足栈溢出等情况时,将会出现,程序员尽量避免直接使用Error类及其子类,以防与虚拟机发起的发生混淆。

throw  throws关键字

        为了代码的灵活性,java允许我们自己抛出异常,以阻止使用者继续进行即将危害程序的行为。这时将需要使用到 throwthrows关键字。

        throw

        我们可以通过throw关键字主动抛出一个Throwable类对象,当运行到该处时,所属的代码块将直接停止并返回。与return类似,并且必须经过 throw 所在的语句的语句无法抵达,编译器也会报错。

void f1(){
    throw new RuntimeException();
    //这是错误的,必须经过 throw 所在的语句的语句无法抵达。与return类似。
    System.out.println("exception!!");
}
void f2(){
    if(a==1)
        throw new RuntimeException();
    //这是正确的,不一定经过 throw 所在的语句的语句可以抵达。
    System.out.println("no exception!!");
}

         写法:与return类似 

throw 异常类型对象;
//例子
throw new Exception();

        throws

        我们可以通过throws关键字被动抛出一个Throwable类,表明该处方法将会抛出一个异常或者错误。当我们将会发生异常或者错误,我们不想处理这个异常的话,可以将其抛出。

f1() throws Exception{
    throw new Exception();
    
}

       写法,将throws写在方法名以及参数括号()后面,方法体前面{},我们可以抛出多个异常,用" , "分隔。如图

void f3() throws 异常类型1,异常类型2 ....{
    //可能有异常的语句。
}
void f4() throws ArithmeticException,ArraylndexOutOfBoundException{
    //可能有异常的语句。
}

        注意:当主动抛出异常类型不是继承自RuntimeException类时,必须将异常处理或者被动抛出。

try...catch...finally 语句

        try语句使我们处理异常的手段。我们将可能发生异常的语句块包裹起来尝试运行(try),当发生问题时,我们可以捕获(catch)问题,停止正在尝试运行的语句并进行处理,最后我们还可以进行收尾工作(finally)。这就是try语句的工作流程。

        写法:与if语句类似使用try{}包裹住可能要发生或者抛出异常的语句块,在其之后添加catch语句块,在()中定义你要捕获的Throwable类的变量,在{}中写入在该捕获问题的处理语句。我们可以在catch语句后面继续添加catch语句捕获不同的问题。最后我们可以添加fially语句将处理收尾工作的代码写入其中。

void f1(){
    try{
        //可能发生异常的语句
    }catch(要捕获的Throwable类1 变量名){
        //处理方式1
    }catch(要捕获的Throwable类2 变量名){
        //处理方式2
    }catch(要捕获的Throwable类3 变量名){
        //处理方式3
    }
    ...finally{
        //收尾方式
    }

    //例子1
    try{
       int i=1/0;//发生除数为零的异常
    }catch(ArithmeticException e){//捕获算术异常
        e.printStackTrace();//输出问题信息
    }

    //例子1
    try{
        int i=1/0;//发生除数为零的异常
        throw new IOException();
    }catch(IOException e){//捕获输入输出异常
        e.printStackTrace();//输出问题信息
    }catch(ArithmeticException e){//捕获算术输出异常
        System.out.println("Exception is happened!")//输出Exception is happened!
    }finally{//try语句无论是否运行成功都将执行finally里的内容
      System.out.println("try is over.")//输出try is over.
    }

}

注意:我们捕获异常时,若异常间存在父子关系,我们需要先捕获子类异常,再捕获父类异常

           若执行try语句且存在finally语句,finally语句必将执行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值