java学习之异常篇

1. 异常的产生

异常是java的一个特色,合理的使用异常处理,可以让我们的程序更加的健壮。

  1. 异常是导致程序中断执行的一种指令流,异常一旦出现且未进行合理处理时程序将中断执行。
  2. 不做任何处理时,一旦异常产生之后产生异常的语句以及之后的语句将不再进行,默认情况下是进行异常输出并结束程序的运行。我们要解决的问题是:即使出现了异常,那么也应该让程序正确的执行完毕。

2. 处理异常

要想进行异常的处理,在java中提供了三个关键字:try、catch、finally。而这三个关键字的使用语法如下(允许有多个catch,也可以省略finally):

try{
有可能出现异常的语句
}catch(异常类型 对象){
异常处理
}finally{
不管是否出现异常都要执行
}

因此,可以有的组合为:try...catchtry...catch..finally 以及try...finally

可以使用e.printstackTrace();打印完整的异常信息。

3. 异常的处理流程

  1. 所有的异常类都是Throwable类的子类。

在这里插入图片描述
面试题:请解释Error和Exception的区别。

  • Error指的是JVM错误,即此时的程序还没有执行,如果没有执行用户无法处理。
  • Exception指的是程序运行中产生的异常,用户可以处理。

也就是说所谓的异常处理指的是所有Exception以及它的子类异常

  1. 异常处理流程:

在这里插入图片描述

  • 当程序运行过程中出现异常时,JVM自动根据异常类型实例化一个与之类型匹配的实例化对象
  • 产生异常对象后,判断是否存在异常处理,有无try…catch:
  • 如果没有异常处理,则交给JVM处理,处理方式为输出异常处理并结束程序运行;
  • 如果存在异常处理,则由try语句捕获产生的异常类实例化对象,而后与try语句后的每一个catch语句进行比较,若匹配则处理异常,若不匹配则继续向下匹配;
  • 不管最后异常处理是否能够匹配,那么都要向后执行,如果此时程序中存在finally语句,则先执行finally语句,但是执行完毕后要根据之前的catch匹配结果来决定如何执行程序;不存在finall则交给JVM处理,处理方式为输出异常处理并结束程序运行;
  • 如果之前已经匹配catch,即已经捕获异常,则继续执行finally后的语句;若没有捕获到相应的异常,则交给JVM处理,处理方式为输出异常处理并结束程序运行。

整个过程就好比方法重载一样,根据catch后面的参数类型进行匹配,但是所有的java对象都存在有向上转型的操作支持,也就是说要简化代码,匹配类型直接匹配Exception即可

  1. 两点说明:
  • 在编写多个catch语句捕获异常时,捕获范围大的异常一定要放在捕获范围小的异常后面,否则会报错;
  • 虽然直接捕获Exception比较方便,但是这样也不好,因为所有的异常都会按照同样一种方式进行处理,在一些要求严格的项目里面异常分开处理会更好。

整个过程离不开引用传递+对象多态性的支持。

4. 关键字throws

throws主要用于方法声明上,指的是当方法之中出现异常后交由被调用处来处理。

  1. 方法声明中有throws,则调用方法时要进行异常处理(try...catch)。

  2. 主方法也属于方法,那么主方法上能否使用throws抛出异常呢?可以,在主方法上使用throws抛出异常,那么这个异常就将交给JVM进行处理,则由JVM抛出异常信息,结束程序运行。

    注意不要在主方法上加throws,因为即使程序出错,也希望可以正常的结束调用。

5. 关键字throw

  1. 在程序运行期间可以直接使用throw手工的抛出一个异常类的实例化对象。

在这里插入图片描述

面试题:请解释throw和throws的区别。

  • throw:指的是在方法之中人为抛出一个异常类对象,这个对象可能是自己实例化或者抛出已存在的。
  • throws:指的是在方法声明上使用,表示此方法在调用时必须处理异常。

6. RuntimeException类

运行时异常。

在Java中为方便代码编写,提供RuntimeException类,最大特征在于程序编译时不会强制用户处理异常,用户可以根据自己的需要选择性进行处理。但若用户不处理异常且异常发生,则将自动交给JVM处理。也就是说,RuntimeException类的子异常类可以由用户根据需要选择进行处理。

面试题:请解释Exception与RuntimeException的区别,并列举几个RuntimeException类的子类。

  • Exception是RuntimeException的父类;
  • Exception定义的异常类必须进行处理,RuntimeException的异常类可以选择性进行处理。
  • 常见的RuntimeException:ArithmeticException(算术异常),NullPointerException(空指针异常),ClassCastException(强制类型转换异常)

在这里插入图片描述

Runtime类

  1. 在每一个JVM进程里都会存在一个Runtime类的对象,这个类的主要功能是取得一些与运行时有关的环境属性或创建新的进程等操作
    在这里插入图片描述
  2. 在Runtime类定义的时候,其构造方法已经被私有化了,这就属于单例模式的应用,因为要保证在整个进程里面只有一个唯一的Runtime类的对象。
  3. 在Runtime类里面提供了一个static修饰的方法,用以取得与当前Java应用程序相关联的 Runtime对象。
    在这里插入图片描述
  4. Runtime类是直接与本地运行有关的所有相关属性,所以在Runtime类里面定义有如下方法:
  • public long maxMemory() 返回Java虚拟机将尝试使用的最大内存量。 如果没有固有的限制,则返回值Long.MAX_VALUE 。

  • public long totalMemory()返回Java虚拟机中的内存总量。 此方法返回的值可能随时间而变化,具体取决于主机环境。

    请注意,保存任何给定类型的对象所需的内存量可能取决于实现。

  • public long freeMemory() 返回Java虚拟机中的可用内存量。 调用gc方法可能会导致增加返回的值freeMemory.

  • public void gc()运行垃圾回收器。 调用此方法表明,Java虚拟机花费了回收未使用对象的努力,以使其当前占用的内存可用于快速重用。 当控制从方法调用返回时,虚拟机已尽全力回收所有丢弃的对象。

面试题:请介绍什么是GC?如何处理?

  • GC(Garbage Collector)垃圾收集器,指的是释放无用的内存空间。
  • GC会由系统不定期进行自动回收,或者调用Runtime类中的public void gc()方法手动回收。

实际上,Runtime类还可以调用本机的可执行程序并且创建进程:

  • public Process exec(String command) throws IOException 在单独的进程中执行指定的字符串命令。

    这是一种方便的方法。 调用表单exec(command)的行为方式与调用exec(command, null, null)完全相同 。

在这里插入图片描述
在这里插入图片描述

小结:

  • Runtime类使用了单例设计模式,必须通过内部的getRuntime()方法才可以取得Runtime类对象。
  • Runtime类提供了gc()方法,可以手动释放内存。

7. assert关键字

assert关键字是在JDK 1.4时引入的,其主要的功能是进行断言。

在Java中断言指的是程序执行到某代码处时一定是预期的效果。

默认情况下,断言是不应该影响程序的运行的,也就是说java解释程序的时候断言是默认不起作用的。

启用断言:

java -ea 主类名

在Java里面断言的设计要比C++强很多,它不会影响到程序的执行,但是使用意义不大。

8. 小结

  1. Exception的父类是Throwable,但是在编写代码的时候尽量不要使用Throwable,因为Throwable下还包含Error子类,我们能够处理的只有Exception子类。
  2. 异常处理的标准格式:try、catch、finally、throws。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

就是二二二二婷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值