Java中的异常

1、为什么有异常?

我的理解:
计算机只能识别二进制,我们开发当中使用的是Java或者C这类的高级语言,每种语言都会经过一系列的转换才能被计算机识别,编译器就是用来转换的工具,Java中javac就是一个编译器,在编译过程中出现的错误我们一般称为语法错误(语法错误不算在异常体系中);Java的设计者将程序编译至运行过程中发生的错误封装成一个类(Throwable),在该类中根据能否被程序员处理分为了Error和Exception,异常就是在运行过程中出现的问题且能被程序员使用和解决的问题。

Error和Exception:

  • 相同点:

它们都是Throwable类的子类

  • 不同点:

Error是Java无法解决的严重错误,一般是系统内部出现的错误,因为无法处理,一般不进行处理

Exception类是java中异常的根类,在Java中是程序员能够处理且处理过后不直接让程序崩溃的类

异常的分类

运行时异常(RuntimeException )

编译器不要求强制处理的异常(编译器检测不出来的异常),一般是指编程时的逻辑错误;我们应该避免出现这类的异常

编译时异常(非运行时异常\非RuntimeException)

此类异常时除了运行时异常之外的异常,一般在编译阶段,编译器就能检测出的异常,此类异常不进行处理无法通过编译

总结定义:

异常是程序在“编译”或者“执行”的过程中可能出现的问题。

2、异常用来干什么?

我的理解:
当我们之后写一个较为庞大的程序时,若随便碰到一个能够解决的问题导致该程序完全崩溃,这是不合理的,Java设计者为了程序的健壮性设计异常,在遇到问题的时候,不会导致程序的完全崩溃,通过处理异常的方法解决了这个问题,程序还能够继续运行。在java中指的是程序在执行过程中,出现的非正常的情况,最终会导致JVM的非正常停止,处理了非正常情况,JVM正常运行。
由于开发者将能够处理的异常都封装成了异常类,在默认情况下,异常会输出一个错误信息,然后中止程序的执行。为了更好地处理异常情况,程序开发人员通常会在程序中定义异常处理代码块来捕获和处理异常。

总结作用:

提高代码的 健壮性:并不会因为出现小问题而使程序停止(崩溃)。
具有一定的 便利性:在使用Java开发的过程中,开发人员不必专门去编写这些测试代码就可以比较容易地发现异常,并且可以通过异常来处理相关问题。

3、处理异常

处理方式:

  • 捕获异常

try//try块表示程序正常的业务执行代码。如果程序在执行try块的代码时出现了“非预期”情况,JVM将会生成一个异常对象,这个异常对象将会被后面相应的catch块捕获。
{
   // 程序代码
}catch(异常类型 e1)//catch块表示一个异常捕获块。当程序执行try块引发异常时,这个异常对象将会被后面相应的catch块捕获。
{
   //Catch 块
}finally//finally块代表异常处理流程中总会执行的代码块。
{ 

}
执行规则:
  1. 若try块中不出现异常,则执行try块中的所有语句,catch块中的语句不执行,如果后面有finally块,最后执行finally里的语句

  1. 若发生异常,try块异常发生后,不再执行try块剩下的语句,将执行catch块中的语句,如果后面有finally块,最后执行finally里的语句

多重捕获块

一个 try 代码块后面跟随多个 catch 代码块的情况就叫多重捕获。

多重捕获块的语法如下所示:

try{
   // 程序代码
}catch(异常类型1 异常的变量名1){
  // 程序代码
}catch(异常类型2 异常的变量名2){
  // 程序代码
}catch(异常类型3 异常的变量名3){
  // 程序代码
}...

注意事项:

  1. try块后面可以跟多个catch代码块

  1. 若try块中有异常,第一个catch块会捕获,若异常类型匹配则在这里被捕获,若异常类型不匹配,则传递给第二个catch,直到异常被捕获。

  1. 若异常类型满足子父类的情况,则要求子类异常类型一定声明在父类异常类型的上面,否则会报错

例如:

写出程序结果 :
class Exc0 extends Exception {
}

class Exc1 extends Exc0 {
}

class Demo {
    public static void main(String[] args) {
        try {
            throw new Exc1();
        } catch (Exception e) {
            System.out.println("Exception");
        } catch (Exc0 e) {//在编译器中是无法通过编译的,为什么?
            System.out.println("Exc0");
        }
    }
}
  • 抛出异常

throws用于在方法签名中声明抛出一个或多个异常类,throws关键字后可以紧跟一个或多个异常类。如果一个方法(中的语句执行时)可能发生某种异常,但是并不能确定如何处理这种异常,则此方法应显示地声明抛出异常,表面该方法不对这些异常进行处理,而由该方法的调用者负责处理。

定义格式:

public void 方法() throws 异常类名 {
    
}

示例代码:

public class ExceptionDemo {
    public static void main(String[] args) {
        System.out.println("开始");
//        method();
        try {
            method2();
        }catch (ParseException e) {
            e.printStackTrace();
        }
        System.out.println("结束");
    }

    //编译时异常
    public static void method2() throws ParseException {
        String s = "2048-08-09";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date d = sdf.parse(s);
        System.out.println(d);
    }

    //运行时异常
    public static void method() throws ArrayIndexOutOfBoundsException {
        int[] arr = {1, 2, 3};
        System.out.println(arr[3]);
    }
}

throw用于手动地抛出异常对象。throw后面需要一个异常对象。

意义

位置

关键字后跟的东西

throws

异常处理的一种方式

方法声明处

异常类型(异常类)

throw

手动生成异常对象的关键字

方法体中

异常对象

4、自定义异常

当Java提供的异常类,不够使用时,需要自己定义一些异常类。

public class 自定异常类名 extends Exception 或者 RuntimeException{
    //添加一个空参数的构造方法
    //添加一个带异常信息的构造方法
}

注意事项:

1.自定义异常类一般都是以Exception结尾,说明该类是一个异常类

2.自定义异常类,必须继承 Exception (编译异常)或者 RuntimeException(运行异常)--异常指程序执行期非正常执行导致程序终止

继承 Exception (编译异常):那么自定义的异常类就是一个编译器异常,如果方法内部抛出了编译器异常,就必须处理这个异常,要么throws,要么try-catch

继承RuntimeException(运行异常:那么自定义的异常类就是一个运行期异常,无需处理,交给JVM处理。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值