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

您所在的位置:网站首页 出现异常怎么处理 Java:异常的概念及分类、异常的处理、异常抛出及自定义异常

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

2024-07-12 17:19| 来源: 网络整理| 查看: 265

异常概念

异常分类

  Java异常处理机制

try ...catch...finally

throw和throws

自定义异常

一、异常的概念

        什么是异常?

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

        异常导致的后果?

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

        如何让防止程序中断?  

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

异常的分类

                                        Throwable       

Error                                                                                          Exception

                                                        IOException                                 Runtime   Exception                    

        

        异常类型               包括                来源                处理

受查异常

checkedException

Excption及其子类

(不包括

RuntimeException

及其子类)

由代码控制能力之

外的因素导致的运

行时错误

必须要处理,否则

通不过编译

非受查异常

uncheckedException

Error和

RuntimeException

及其子类

RuntimeException

一般代表编程错误

可以不用处理

这种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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3