1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > Java:异常的概念及分类 异常的处理 异常抛出及自定义异常

Java:异常的概念及分类 异常的处理 异常抛出及自定义异常

时间:2019-01-29 00:54:30

相关推荐

Java:异常的概念及分类 异常的处理 异常抛出及自定义异常

异常概念

异常分类

Java异常处理机制

try ...catch...finally

throw和throws

自定义异常

一、异常的概念

什么是异常?

所谓异常是指在程序运行的过程中发生的一些不正常事件。(如除0溢出,数组下标越界,所要读取的文件不存在)。(比如上下转型的时候,出现类型转换异常)

异常导致的后果?

Java程序的执行过程中如出现异常事件,可以生成一个异常类对象,该异常对象封装了异常事件的信息,并将其被提交给Java运行时系统,这个过程称为抛出异常,不处理的话会直接导致程序直接中断

如何让防止程序中断?

设计良好地程序应该在程序异常发生时提供处理这些异常的方法,使得程序不会因为异常的发生而阻断或产生不可预见的结果

异常的分类

Throwable

ErrorException

IOException Runtime Exception

这种Error是系统运行Java虚拟机的异常,这种异常跟我们写的代码没有关系,像这种异常我们处理不了,基本上检查操作系统,检查运行的环境

我们能处理的异常叫做 Exception

它分为IOException和Runtime Exception

IOException就像我们读取磁盘的某个文件不存在,怎么办。v

由代码控制能力之外的因素导致的运行时错误:比如你去读取磁盘上的某个文件,在运行的过程中消失了,读取失败,或者你连接某个服务器,连接某个网络,连不上了,你不能因为这种异常导致程序崩了呀,这时候必须要处理,否则编译通不过,编译通不过是小事,最害怕程序运行一半崩了

非受查异常:可以不用处理

RuntimeException一般代表编程错误:代表你程序员写代码的水平是有问题的,比如说,除数除以0,或者多态讲解的上下转型,向下转型的时候,你把狗转化成了猫,那你之前为什么不做一个instanceof的判断呢?都是程序员常规的编码错误,这种错误处理也没什么意义

二、Java异常处理机制

Try-catch-finally

try 监控区域,执行可能产生异常的代码

catch 捕获、处理异常

finally 善后处理,无论是否发生异常,代码总能执行

try 监控区域,执行可能产生异常的代码:

读文件,连接网络,它可能出现文件没有,或连接不上网络

放在生活中,比如你去上班路上堵车,你不可能因为堵车今天就不去上班了

堵车就是一件异常事件,try就是你尝试从家里到公司这件事情,catch 就是堵车,finally打电话报备一下今天会迟到

try -catch -finally

try{}语句块中放的是要检测的Java代码,可能有会抛出异常,也可能会正常执行

catch{}(异常类型){}块是当Java运行时系统接收到try块中所抛出的异常对象时,会寻找能处理这一异常catch块来进行处理(可以有多个catch块)。

finallly{}不管系统有没有抛出异常都会去执行,一般用来释放资源。除了在之前执行了System.exit(0)

try{}语句块中放的是要检测的Java代码,,可能有会抛出异常,也可能会正常执行:

对一个空指针进行操作的话,他肯定会报错,报空指针异常然后结束

catch{}(异常类型){}块是当Java运行时系统接收到try块中所抛出的异常对象时,会寻找能处理这一异常catch块来进行处理(可以有多个catch块)。

那如果你用catch{}捕获异常,程序不会崩,会往下走,他会收到catch{}抛出的异常对象

finally{}不管系统有没有抛出异常都会去执行,一般用来释放资源。除了在之前执行了System.exit(0):

System.exit(0)程序退出

try -catch -finally:

不是说非要三个一起,就像if else ,你只有if ,没有else 也是可以的

try 可以和catch 配合 没有finally

try也可以和finally配合没有catch

新建一个工程

运行结果

程序崩了,并且end并没有输出

那如果我们用try 呢?

单独一个try是不给的

try加上一个finally,

运行结果,你会发现程序崩了归崩了,但是还是能看到end,

所以finally不管异常有没有抛出,finally里面的东西都会执行

当然,你try去尝试跑这个代码,一定需要catch某个东西,

比如上面这个异常叫java.lang.NullPointerException,我们要去捕获这个异常

如何捕获

运行结果

捕到了,而且程序并没有崩

没有崩如何验证呢?

程序会正常的跑下去

运行结果

这就是程序异常的时候,有解决方案

其实像数学异常也是一样的

运行结果

就想输入0

出现了java.lang.ArithmeticException 数学异常

同样的去捕获数学异常

像这种异常是很low的

可以让他重新再来一次,看能不能解决这个问题,也就是遇见异常后的解决方案

运行结果

这就是我们说的try -catch - finally

当然finally可以不用要

运行结果,当你输入9的时候,

他不会抓到这些异常,

所以里面的东西也不会去执行catch(java.lang.ArithmeticException e) {

System.out.println("你输入了0,请重新输入");

b = sc.nextInt();

c =a/b;

System.out.println("c="+c);

}

这样程序看起来怪怪的,我们可以把c放到下面 第 33行

错误提示:The local variable c may not have been initialized

这里面的c看不到

我们给c做一个初始化 第14行

运行结果

输入0不行,再输入6可以了,

当然这个1 是因为四舍五了

修改一下

运行结果

他这边有个问题,他是个语句块,你如果把a放到try下面的话 第20行

错误提示:a cannot be resolved to a variable

这边的a就识别不到了 第30行

有点像局部变量的意思

所以try-catch 这遍的变量注意,尽量往外面放,放到大家都能看见的位置

异常有很多,大家不需要记住

你去抓住异常的祖先

比如说Exception

他就直接报错了 : Unreachable catch block for ArithmeticException. It is already handled by the catch block for Exception

已经被Exception处理了,因为Exception 是捕获所有的异常

可以全部放在一起运行,不管你是出现了对空指针访问异常,还是出现了除法异常,都可以

三、异常抛出及自定义异常

throw 和 throws

throw用于手动抛出异常。作为程序员可以在任意位置手动抛出异常。

throws用于在方法上标识要暴露的异常。抛出的异常交由调用者处理。

两者区别

throw用在方法内,后面跟上要抛出的异常类对象

throws修饰在方法上,告诉调用者此方法可能会抛出异常,后面跟上可能要抛出的异常类名

throws用于在方法上标识要暴露的异常。抛出的异常交由调用者处理。:

也就是你分装了一个方法,要告诉方法的调用者,使用你这个方法会存在什么异常

新建一个工程

比如说我现在有一个酒吧class Bar

然后做一个构造方法public Bar(int age){

this.age = age;

}

然后再来一个检查,如果age小于18岁,认定是它一个异常,我们就throw一个new

运行结果

15岁进来,程序异常,崩了,end不能执行

我们为了不让程序崩,在这面try一下

运行结果

修改一下24行

运行结果

也可以把抛出异常的数据给他体现出来e.printStackTrace();

运行结果

这就是throw的作用,我们可以手动的在某个地方,抛出这个异常

我们是不是要知道函数存在哪些异常呀,所以这面做一个提醒

void check()throws IllegalArgumentException 第9行

这样我catch就能catch到

Java异常处理机制

throw throws

抛出异常 声明异常

throw throws

手动抛出异常声明方法可能要抛出的异常

class Bar{

public void enter(int age){

if(age<18){

//受查异常(必须捕获,不捕获编译都通不过)和非受查异常

throw new IllegaArgumentException("年龄不合格");

}else{

System.out.println("欢迎光临");

}

}

}

常见异常

RuntimeException,IOException, SQLException,

ClassNotFoundException

自定义异常

Java提供的异常体系不可能预见所有希望加以报告的错误、

·自定义异常类必须从已有的异常类继承

·建立新的异常类型最简单的方法就是让编译器产生默认构造方法

·对异常来说,最重要的部分就是它的类名

·可以为异常类定义一个接受字符串参数的构造方法,字符串参数描述异常信息

像这种 IllegalArgumentException用的不是那么顺,

我们可以自己定义一个AgeLessThanEighteenException

这种类定义出来,你不能把他叫成异常类,通常Java这边的习惯是继承Exception

class AgeLessThanEighteenException extends Exception 第16行

运行结果

我们自定义一个自己的异常,class AgeLessThanEighteenException extends Exception

然后抛出这个异常 throw new AgeLessThanEighteenException("年纪太小"); 然后捕获这个异常catch(AgeLessThanEighteenException e)

你要告诉调用者你会产生这种异常void check()throws AgeLessThanEighteenException

像这种异常,我们叫做受查异常,因为它继承Exception

(受查异常:就是我们不修改的话,编译都通不过

RuntimeException 比如除于0这件事,或者空指针等等,可以不处理,但是程序会崩)

这种异常没有catch的话,编译是不允许的

编译都不过

错误提示:Unhandled exception type AgeLessThanEighteenException

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。