Java学习笔记—异常类(Ecxeption)、throw与throws、final与finally的区别

目录

1、异常的概述

2、异常的作用

3、异常的体系结构 

3.1、java异常体系

3.2、Error与Erxception

3.3、异常处理方式 

4、throws和throw的区别

5、final和finally的区别

6、java中常见的异常


1、异常的概述

Java程序在执行过程中发生的不正常情况,而导致JVM非正常终止的情况,就叫做“异常” 

注:异常并非指是语法错误和逻辑错误,而是语法错了,编译无法通过,程序无法运行,无法产生相应的节码文件。

2、异常的作用

Java异常机制可以使程序中“异常代码”和“正常代码”分离,保证程序代码更加优雅,提高程序的健壮性(java将该异常信息打印输出在控制台,供程序员参考,程序员看到异常信息之后,可以对 程序进行更改,从而使程序更加健壮)

3、异常的体系结构 

3.1、java异常体系

 

Java把异常当作对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类。

(1)、在Throeable类中定义了两个直接子类:Error(错误)和Exception(异常)

(2)、异常类Exception又分为运行期异常编译期异常

  • 编译期异常:(即checked异常、受检异常):在代码编译阶段,编译器就能明
    确警示当前代码可能发生(不是一定发生)XX异常,并明确督促程序员提前编写
    处理它的代码。如果程序员没有编写对应的异常处理代码,则编译器就会直接判
    定编译失败,从而不能生成字节码文件。通常,这类异常的发生不是由程序员的
    代码引起的,例如:FileNotFoundException(文件找不到异常)、日期格式化
  • 运行时期异常:(即runtime异常、unchecked异常、非受检异常):在代码编译阶段,编译器完全不做任何检查,无论该异常是否会发生,编译器都不给出任何提示。只有等代码运行起来并确实发生了XX异常,它才能被发现。通常,这类异常是由程序员的代码编写不当引起的,只要稍加判断,或者细心检查就可以避免。如:IndexOutOfBoundsException(数组越界异常)、ClassCastException(类型转换异常)、NumberFormatException(数字格式化异常)、NullPointerException(空指针异常)、ArithmeticException(算术异常)等
  • :java.lang.RuntimeException类及它的子类都是运行时异常。比如:
           ArrayIndexOutOfBoundsException数组下标越界异常,
           ClassCastException类型转换异常。

3.2、Error与Erxception

(1)、Error错误:这种错误无法处理,是属于Java运行时系统的内部错误和资源耗尽或者Java虚拟机无法解决的严重问题,如系统崩溃,虚拟机出错误等,一般不编写针对性的代码进行处理。因为捕获了也解决不了,这个不是由程序产出的,而是底层出现问题,如果出现这样的内部错误,除了尽力使程序安全地终止之外,再也无能为力了。(如:如堆溢出(OutOfMemoryError)、线程死亡(ThreadDeath)、栈溢出(StackOverflowError等)

(2)、Exception:因编程错误或偶然的外在因素导致的一般性问题,需要使用针对性的代码进行处理,使程序继续运行。否则一旦发生异常,程序也会挂掉。

3.3、异常处理方式 

Java的异常处理是通过5个关键字来实现的:try、catch、 finally、throw、throws

  • try
    检测不安全的代码块(发现异常)
    try块中任何一条语句发生了异常,下面的代码将不会被执行,程序将
    跳转到异常处理代码块中,即catch块。因此,不要随意将不相关的代
    码放到try块中,因为随时可能会中断执行。
  • catch
    把抓到的类型匹配的异常捕获,保证程序能继续运行下去
    catch语句必须紧跟着try语句之后,称为捕获异常,也就是异常处理函数,
    一个try后面可以写多个catch,分别捕获不同类型的异常,要从子类往父类
    的顺序写,否则有编译错误。
    捕获异常的有关信息:
            getMessage() :获取异常消息信息,返回字符串
           printStackTrace(): 获取异常类名和异常信息,以及异常出现在程序中的
    位置,返回值void。
  • finally
    finally该内容总是会执行的,只能有一个finally语句。
  • throws
    定义一个方法的时候可以使用throws关键字声明,表示此方法不处理异常,而交给方法调用处进行处理。
  • throw
    关键字用于显式抛出异常,抛出的时候是抛出的是一个异常类的实例化对象。

4、throws和throw的区别

          throws:在方法声明后使用,后面跟的是异常类名

          throw:在方法声明体内使用,后面跟的是异常类对象

public void exam () throws Exception { // 用在方法声明后,后跟 异常类名
        int x = 5;
        int y = 0;
        if(y == 0){
            throw new MyException(); // 用在方法体内,后跟 异常类对象名
        }else {
            System.out.println(x / y);
        }
    }

区别2:

          throws: 可以跟多个异常类名,用逗号隔开

          throw: 只能抛出一个异常对象名

public static void main(String[] args) throws ArithmeticException, Exception { // 后面可以有多个异常类名
        int x = 5;
        int y = 0;
        if(y == 0){
            throw new MyException(); // 只能有一个异常类对象名
        }else {
            System.out.println(x / y);
        }

区别3:

          throws:表示抛出异常,由该方法的调用者来处理

          throw:表示抛出异常,由该方法体内的语句来处理

public static void main(String[] args) {
        try{
            print(); // 由该方法的调用者来处理
        }catch (ArithmeticException e){
            e.printStackTrace();
        }
    }
    public static void print() throws ArithmeticException{
        int x = 5;
        int y = 0;
        if(y == 0){
            throw new ArithmeticException(); //由该方法体内的语句来处理
        }else {
            System.out.println(x / y);
        }
    }

区别4:

          throws:表示有出现异常的可能性,并不一定出现这些异常

          throw:表示抛出了异常,执行throw则一定出现了某种异常

public static void main(String[] args) {
        try{
            print(); // 由该方法的调用者来处理
        }catch (ArithmeticException e){
            e.printStackTrace();
        }
    }
    public static void print() throws ArithmeticException{
        int x = 5;
        int y = 0;
        if(y == 0){
            throw new ArithmeticException(); //由该方法体内的语句来处理
        }else {
            System.out.println(x / y);
        }
    }

总结:

throws:用来声明一个方法可能产生的所有异常,不做任何处理,而是将异常上传,谁点,将 异常抛给调用者

            用在方法声明的后面,跟的是异常类名

            可以跟多个异常类名,用逗号隔开

            表示抛出异常,又该方法调用者处理

            throws表示出现异常是一种可能性,不一定会发生异常 

throw:用来抛出一个具体的异常类型

            用在方法体内,跟的是异常对象名

            只能抛出一个异常对象名

            表示抛出异常,有方法体内的语句处理

            throw抛出异常,执行throw则是一定发生可某种异常

5、final和finally的区别

 final:是一个修饰符,表示最终的,通常用来修饰类、方法、变量,修饰变量通常与static关键字连用,表示一个常量(final修饰局部变量时,可以在定义时指定默认值,也可以不指定默认值)

           final修饰的类不能被继承;

           final修饰的方法不能被重写,但是却可以重载

           final修饰的变量不能被修改,只能赋值一次

例:

 finally:是一个关键字,可以在try后使用,也可以与try - catch语句一起连用。在异常中无论程序是否发生异常,finally代码块是一定执行的,通常用来释放或者关闭一些必须执行的程序(如:磁盘文件、网络连接等),进行资源的清除工作,删除临时文件等。

6、java中常见的异常

注:只列出Java中常见的十九种异常 

java.lang.NullPointerException空指针异常
java.lang.ClassNotFoundException类指定异常
java.lang.NumberFormatException字符串转换为数字异常
java.lang.IndexOutOfBoundsException数组下标越界异常
java.lang.IllegalArgumentException方法参数错误异常
java.lang.IllegalAccessException访问权限异常
java.lang.ArithmeticException数学算数异常
java.lang.ClassCastException类型转换异常
java.lang.FileNotFoundException文件未找到异常
java.lang.ArrayStoreException数组存储异常
java.lang.NoSuchMethodException方法不存在异常
java.lang.NoSuchFiledException文件访问异常
java.lang.EOFException文件结束异常
java.lang.InstantiationException对象实例化异常
java.lang.InterruptedException被中止异常(大多数在线程中遇到)
java.lang.CloneNotSupportedException 克隆不支持异常
java.lang.OutOfMemoryException 内存溢出异常(内存不足异常)
java.lang.NoClassDefFoundException 未发现类异常
java.lang.NumberFormatException数字格式化异常

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值