java 链式异常_java异常(待补充链式异常和自定义异常)

常见的java异常类:

e4ad902486f851db8301f046bc1b1b96.png

java异常类的分类:(这里的异常不是指Exception,免检异常可以理解为和程序员无关,是运行过程中用户和jvm造成的异常;必检异常可以理解为只有程序员能解决的异常,程序要是不解决这个异常,程序就运行不起来,用户和jvm就无法接触到这个程序)

b37455f6648964396b9ceb05dc5096e4.png

异常的概念:

异常是指那些阻止程序正常运行的错误或情况,如果异常没有被处理,程序将被非正常终止。

我们进行异常处理的目的只有两种,让程序继续运行或让其优雅终止。

异常处理只有两种方式:①jvm自动处理  ②我们自己定义处理方式     (注意,类库中定义的方法只会声明和抛出异常,如果我们不处理这个异常,就会抛给jvm来处理)

java的中所有的异常的根类是Throwable,Throwable的直接子类是Exception和Error。

Error通过单词我们就知道,是错误的意思,这种错误一般是jvm运行产生的错误,出现这种错误,我们的程序不能解决,比如内存溢出oom,堆溢出等。这种错误,我们不必处理,直接让jvm抛出报错,我们没办法解决就不管了。

Exception中文意思是异常,那么Exception又分为运行时异常和编译时异常。

RuntimeException类及子类就是运行时异常,即开发中,测试功能时,程序终止,控制台上出现的异常,比如有数组越界,空指针异常等,注意,运行时异常就是免检异常,但免检异常不只有运行时异常,还包括error。

Exception还有一类是编译异常,这是除RuntimeException类及子类外的所有Exception类,注意编译异常和必检异常一回事。编译异常,即必须要进行异常处理的异常,否则编译器会报错。通俗的话说就是在写代码时出现红线,需要try catch或者throws时出现的异常。

异常处理一般用到以下几个关键字try,catch,finally,throws,throw:

try:

对于可能会抛出异常的代码一般放在try{}代码块中,①在try块中,如果哪一行抛出了异常,那么try块后面的代码将不再执行,将直接进入异常处理代码块,所以不要把所有代码都放入try块中。②如果没有catch块,则必须跟一个finally块。

c66fd59c8e055a71b012cce28e652b56.png

如果异常没有在把它的抛出的方法里被捕获,该异常就会不断抛给该方法的调用方法,直到该异常被捕获或传到主方法后给jvm处理。

方法层层调用中,一旦异常被其中一个方法所捕获,剩余所有方法都按正常顺序执行,但是没捕获之前的那些方法就只能被迫中断,只执行调用的抛出异常的方法语句之前的所有语句(包括调用的抛出异常的方法语句),finally语句块。

根据上图,看几个例子:

①假设发生了异常3,方法3本身并没有捕获异常3,而是抛出并声明了异常3,向上抛到了方法2,方法2里有异常3 对应的catch块,那么异常3就会被捕获,执行顺序是:主方法→主方法顺序执行→调用方法1→方法1顺序执行→调用方法2→方法2顺序执行→调用方法3→方法3顺序执行→方法3向上抛出异常3,跳过之后除finally外所有语句(本身没有解决,而是抛出)→方法2收到异常3,并且有异常3的catch块,跳过语句5,进行捕获处理,然后进行语句6→方法2结束,返回方法1继续顺序执行,跳过catch块,执行语句3,(finally块),语句4→方法1结束,返回主方法继续顺序执行,跳过catch块,执行语句1,(finally块),语句2。

②假设发生了异常2,方法3本身并没有捕获异常2,而是抛出并声明了异常2,向上抛到了方法2,方法2里没有异常2 对应的catch块,继续上抛给方法1,方法1里有异常2对应的catch块,此时捕获并处理异常2。执行顺序是:主方法→主方法顺序执行→调用方法1→方法1顺序执行→调用方法2→方法2顺序执行→调用方法3→方法3顺序执行→方法3向上抛出异常2,跳过之后除finally外所有语句(本身没有解决,而是抛出)→方法2收到异常2,没有异常2的catch块,跳过语句5,6,只执行(finally块)→方法2结束,返回方法1继续顺序执行,有对应的catch块,跳过语句3,执行catch块,(finally块),语句4→方法1结束,返回主方法继续顺序执行,跳过catch块,执行语句1,(finally块),语句2。

③如果一直没被捕获,主方法将会直接终止,跳过语句1,语句2,但还是会执行(finally块)。

catch:

catch(Excetion e){}这种结构是用来捕获处理,try代码块中抛出的异常的,处理这些异常的代码叫做异常处理器,而且可以有很多的catch代码块,不过要注意的是①如果一个catch块可以捕获一个父类的异常对象,他就能捕获那个父类的所有子类的异常对象。

②当有很多catch代码块,并且catch里面的参数有父子关系的时候,catch里面的参数一定要是子类在前面,父类在后面,这是因为,如果父类在前,那么被捕获的子类异常,会被父类异常的异常处理器处理。(编译器会报错)

finally:

finally代码块是异常处理中一定会执行的代码块,就算没得异常也会执行,有异常则进入catch代码块中处理后,再进入finally中处理。

在这里要注意①假如在try代码块中有return 语句,那么也是先执行finally里面的代码块后再执行return语句的。

②如果try中有return,在finally中也有return,那么最后会返回finally中return的值。

③在以下4种特殊情况下,finally块不会被执行:1)在finally语句块中发生了异常。2)在前面的代码中用了System.exit()退出程序。3)程序所在的线程死亡。

try、catch、finally语句块的执行顺序:

1)当try没有捕获到异常时:try语句块中的语句逐一被执行,程序将跳过catch语句块,执行finally语句块和其后的语句;

2)当try捕获到异常,catch语句块里没有处理此异常的情况:当try语句块里的某条语句出现异常时,而没有处理此异常的catch语句块时,此异常将会抛给JVM处理,finally语句块里的语句还是会被执行,但finally语句块后的语句不会被执行;

3)当try捕获到异常,catch语句块里有处理此异常的情况:在try语句块中是按照顺序来执行的,当执行到某一条语句出现异常时,程序将跳到catch语句块,并与catch语句块逐一匹配,找到与之对应的处理程序,其他的catch语句块将不会被执行,而try语句块中,出现异常之后的语句也不会被执行,catch语句块执行完后,执行finally语句块里的语句,最后执行finally语句块后的语句;

26984ff9fd66c668a300edb0db1717bf.png

throws:

throws的用法是在      函数名(参数1,参数2.....)throws 异常类1,异常类2,异常类3.....{}

throws是声明这个函数可能会有异常产生,作用是通知上级调用方法,该方法会抛出异常。

注意①如果重写方法的时候,如果父类方法没有声明异常,那么子类方法也不能声明异常。

throw:

throw的作用是具体的抛出一个异常类对象,一般在方法里面使用。当在try代码块中使用的时候,直接进入catch代码块中进行处理,也就是说在try代码块中throw语句之后不能再加其他语句。

注意:有throw语句的方法一般会把异常声明,而不是在本方法里捕获。

8962127bc8ce2add00b454d0564ce32e.png

Throwable类中的常用方法:

注意:catch关键字后面括号中的Exception类型的参数e。Exception就是try代码块传递给catch代码块的变量类型,e就是变量名。catch代码块中语句"e.getMessage();"用于输出错误性质。通常异常处理常用3个函数来获取异常的有关信息:

getCause():返回抛出异常的原因。如果 cause 不存在或未知,则返回 null。getMeage():返回异常的消息信息。

printStackTrace():对象的堆栈跟踪输出至错误输出流,作为字段 System.err 的值。

有时为了简单会忽略掉catch语句后的代码,这样try-catch语句就成了一种摆设,一旦程序在运行过程中出现了异常,就会忽略处理异常,而错误发生的原因很难查找。

异常链:(待补充)

你可以简单理解为catch块中没有进行处理,而是抛出了原始异常和一个新异常。

自定义异常:

最好定义的是必检异常。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值