目录

在日常程序设计当中,咱们的程序难免会呈现各种各样的问题,比方格局谬误、标点符号有误、输出不匹配、数组越界等,其中有的属于语法错误,有的则属于异样。

意识异样

察看以下几种写法,能够看到, 在Java中,不同的异样有对应的类进行形容

算术异样:

数组越界:

空指针:

异样的实质

咱们从此图来剖析:咱们所说的异样涵盖着许多类,有Throwable类、Exception、        RuntimeException等等。

Throwable:属于异样体系的顶层类,其派生出两个子类:Error和Exception;

Error:属于Java虚拟机无奈解决的严重错误。如:JVM外部谬误、资源耗尽等;

Exception:这便是咱们常说的异样,能够由程序员解决的异样,其默认是编译时异样。

异样的分类

异样是依据程序执行的工夫来分类的,次要有程序编译时异样和运行时异样两种,除此之外还有一种自定义异样,在最初解说。

1.编译时异样

程序在编译时产生的异样,也称为 受查异样

既然是在编译时呈现了异样,那么程序想要执行,咱们就必须想方法解决掉这样的异样。

2.运行时异样

程序在运行期间呈现的异样,也称为 非受查异样

所有运行时异样的父类都是RuntimeException

异样的解决

咱们始终在讲异样的呈现,那具体要怎么解决这些异样呢?

异样的解决次要有两种,异样须要捕捉,也能够被动抛出异样,上面将认真分析:

解决形式:

1.LBLY事先防御型:

在操作之前就做好短缺的筹备,一旦某一步出现异常就须要解决或者终止。

2.EAFP预先认错型:

try-catch,先将所有流程走完,最初再报出呈现的异样,再依据状况解决或终止;

这种写法的益处是失常流程与异样解决离开,便于浏览,代码清晰。

异样的抛出

当咱们晓得所写的程序中某个局部容易出现异常的时候,能够在执行处被动抛出异样,这样便于察看找到问题。

在Java中能够借助throw关键字,将异样对象抛给调用者;

  1. throw必须写在办法体外部;

  1. 抛出的对象必须是Exception 或者Exception 的子类对象;
  2. 如果只抛出Exception,那么默认是受查异样;
  3. 如果抛出的是 RunTimeException 或者 RunTimeException 的子类,则能够不必解决,间接交给JVM来解决,然而一旦交给JVM解决,程序就会终止;
  4. 如果抛出的是编译时异样,用户必须解决,否则无奈通过编译;
  5. 异样一旦抛出,其后的代码就不会执行;

当须要抛出受查异样时:不能只抛不解决;

解决办法:1.try - catch —— 本人解决;

2. throws申明 —— 交给JVM解决;

异样的申明

当办法中抛出 编译时异样 ,用户不想解决该异样,此时就能够借助throws将异样抛给办法的调用者来解决。即以后办法不解决异样,揭示办法的调用者解决异样。

异样的捕捉

应用try - catch :

try中存储可能呈现问题的代码;

catch中捕捉可能呈现的异样;

察看上面实例的执行:

捕捉与抛出异样雷同:

捕捉与抛出异样不同:

如何抉择适合的解决形式:

  • 对于比较严重的问题(例如领取相干的场景), 应该让程序间接解体, 避免造成更重大的结果;
  • 对于不太重大的问题, 能够记录谬误日志, 并通过监控报警程序及时发送告诉;
  • 对于可能会复原的问题(和网络相干的场景), 能够尝试进行重试;
  • 在咱们以后的代码中采取的是通过简化的第二种形式. 咱们记录的谬误日志是出现异常的办法调用信息, 能很 疾速的让咱们找到出现异常的地位;

finally解决

在写程序时,有些特定状况中,不管程序是否产生异样,都须要执行,比方程序中关上的资源:网络连接、数据库连贯、IO流等,在程序失常或者异样退出时,必须要对资源进行回收。另外,因为异样会引发程序的跳转,可能导致有些语句执行不到,finally就是用来解决这个问题的。

应用办法:

也能够给try前面带上参数:这时候会主动敞开资源

发问:如果finally里也有return,会返回谁?

异样的意义是什么?

1.精确定位异常情况

2.不交给JVM解决,即是出现异常咱们还能够执行后续代码;

自定义异样类

Java中内置的异样类型有时无奈满足工程理论须要,此时就须要咱们本人定义适合的异样类。

自定义异样十分重要,假使工程较大,只通过打印查看起来效率是很低的。

  • 自定义异样通常会继承自 Exception 或者RuntimeException;
  • 继承自 Exception 的异样默认是受查异样;
  • 继承自 RuntimeException 的异样默认是非受查异样;

如何自定义呢?灵感来源于内置类型的写法:

当咱们察看任意一个运行时异样时,会发现它继承了RuntimeException,公有成员能够不写,其次还有两个构造方法。而受查异样与之不同仅在于继承了Exception,那么咱们能够间接模拟来写。

1.自定义运行时异样

2.自定义受查异样

面试问题:

1. throw 和 throws 的区别?

2. finally中的语句肯定会执行吗?

3.异样的解决流程?

  • 程序先执行try局部的失常流程——>如果try中出现异常,就会完结try局部,从catch中寻找是否有匹配异样类,如果找到就执行catch中的代码,如果没有找到,就会向上传递到下层调用者——>如果该调用者仍然匹配不到对应的异样类,就会持续向上传递——>如果直到main办法也没有适合的异样类,就会交给JVM来解决,解决后程序终止;
  • 如果有finally语句,那么无论是否找到,finally中的语句肯定会被执行

对文章中内容感兴趣的小伙伴能够搜寻微信公众号:敲代码的老贾,支付相应材料