今天是对Java面向对象学习的第五天,内容没有前面几天的多,也没有前面几天的抽象,今天学习的内容比较容易理解或者是运用,下面来讲解一下今天所学习的内容:
|–什么是异常
|–java如何处理异常
|–Java异常类的继承关系
|–自定义异常类的使用
|–异常的分类
|–finally关键字
-
什么是异常
什么异常:
异常就是指的程序在运行过程中,发生的不正常(用户操作不当、服务终止、程序BUG……)的程序无法正常运作的情况异常处理的目的:为了提高程序的稳定性和健壮性,让程序正常的运作下去
学习异常的使用是是非常有必要的,因为我们在编写代码的时候对于用户的使用肯定会有各种各样的问题,但是我们作为软件开发者,为了便于软件的正常运行,我们得做出错误的判断,并写进代码里,以便用户在使用软件时,可以及时加以提醒 -
java如何处理异常
异常的处理:提高程序的容错能力、稳定性、健壮性
异常:顾名思义不正常
Java的处理异常方法有两种方式:
1、抓捕异常(推荐):
尝试着抓到对应的异常,在针对具体问题,具体处理
2、抛出异常:
向上抛出
两种异常处理方式里面又有很多的小点知识,接下来会一一讲解
1.抓捕异常:
try {
// 代码块
} catch (XxxException e) {
// 处理异常} catch (XxxException e) {
// 处理异常
}
这是抓捕异常写法,抓捕异常会用try关键字来进行书写,而后会紧跟一个catch关键字,try关键字后面接的catch可以一个也可以多个。
try语法快:
如果没有抓捕到异常,程序正常执行,catch语法快不会进入!!!
如果try中,某行代码触发了一次,则程序立刻进入到对应的异常处理块(catch)中,进行异常处理
这是抓捕异常块的代码运行原理↑
一异常块代码:
try {
} catch() {
} catch() {
} catch() {
} finally {
}
catch括号内的内容填某某异常,例如RuntimeException,指的是运行异常,我们在以后的练习中会遇到各种各样的错误,我们可以慢慢积累异常的各种样式,下面用代码来展示:
这是代码的展示↑,我们接下来来看看运行结果:
这个结果是当输入数据有错误是的结果展示,我们用异常处理可以看到我们利用getUsername()方法获取到了异常的原因是 / by zero,这是异常的结果展示。而如果没有异常的话,我们就不会输出异常块里面的内容,下面我们来看看当输入数据正确时是否是这样:
能看到结果正常输出出来了。
- Java异常类的继承关系
|-- Throwable
|-- Error
|-- Exception
|-- RuntimeException
|-- 非运行时异常
|-- IOException
我们可以看到异常类是在Throwable这个父类里面的,而异常又下辖了几个特殊的大类。
而我们在使用异常这种方法是我们会用到许多的方法:
当异常被捕获到是,异常对象就会自动创建
e.getMessage() // 输出异常信息
e.printStackTrace() // 在控制台上打印输出异常的错误情况(调用栈情况)
这是两种比较常用的异常的信息获取方法,我们可以在控制台清楚的知道出错的内容是什么出错的位置是哪里。
4. 自定义异常类的使用
在项目开发时,一般一个项目需要自定义一个异常,用来传递信息
在java中,自定义异常非常简单,只要继承了Exception类(称为Exception的子类)即可,该类就是一个异常类。
我们可以分为几种解决异常的方法:
人为的抛出异常:
throw关键字抛出异常
throw 异常对象
第二种解决异常的方案:
抛出异常,由上层解决
方法名字后面 throws 异常名称 {
}
一旦使用抛出方案
异常将由调用者来解决
就比如一个方法里面写的异常块,他就会让调用他的块来进行解决,如果调用他的块仍然不能解决,就一直往上抛出解决,如果都解决不了就直接jdk自身来解决,仍然解决不了直接结束,这就类似一个套娃的样式。
例如:
public static void main(String[] args) throws Exception …{
try{
ThrowAndThrows.sqrt("-124.56");
} catch(Exception e) …{
//将sqrt方法声明的可能抛出的Exception异常捕获
//打印捕获的异常的堆栈信息,从堆栈信息中可以发现异常发生的位置和原因
System.out.println(“Got a Exception:” + e.getMessage());
e.printStackTrace();
throw e; //不做进一步处理,将异常向外抛出
}
这是写抛出异常代码块的写入样式
-
异常的分类
异常的分类:
|-- 运行时异常:继承了RuntimeException的异常
特点是:只有在运行时,才能知道是否会有异常
|-- 非运行时异常(编译型异常):
特点是:在编译时,就会报错,必须处理!!!
这就是在之前的异常的继承关系类里面的特殊异常 -
finally关键字
finally关键字:特点:不管是否存在异常,finally部分必须要执行
try {
} finally {
// 重要的,必须要执行的、如资源的释放、垃圾的回收等等
}
这是finally关键字的代码演示,可以看到finally关键字块的内容是一定会输出的,可以看到我们这段代码是有异常的,当我们在异常块里报出异常时,并没有直接结束,而是最后finally关键字的块也输出出来了,可见不管异常与否,都会输出finally里面的内容。