什么是异常?
组织不佳的代码不能运转,这是Java的基础理念。
发明毛病的抱负机遇是在编译期。但是,编译器并不能发明一切的毛病,余下的题目就须要在递次运转时处置惩罚。这就须要毛病能经由过程某种体式格局,把恰当的信息 通报给特定的接收者处置惩罚。
Java中的异常处置惩罚的目标在于经由过程运用少许的代码来简化大型、牢靠的递次的生成,经由过程此体式格局让你的运用中没有未处置惩罚的毛病,而且它还带来了一个显著的优点:下降毛病处置惩罚代码的复杂度。
异常,依据字面明白,有不测之意。把它置于代码层面来明白,即阻挠了当前要领或作用域继续实行。异常是致使递次没法在其预期的实行中运转的事宜。异常有三种范例——搜检异常、毛病和运转时异常。
在Java中,异常被当作对象来处置惩罚,其基类是Throwable。
Java中的异常范例
Java从Throwable直接派生出Exception和Error。个中Exception是能够抛出的基础范例,在Java类库、要领以及运转时毛病中都能够抛出Exception型异常。Exception示意能够恢复的异常,是编译器能够捕捉到的;Error示意编译时和体系毛病,示意体系在运转时期涌现了严峻的毛病,属于不可恢复的毛病,由于这属于JVM条理的严峻毛病,因而这类毛病会致使递次停止实行。Exception又分为搜检异常和运转时异常。
异常类的组织条理图以下:
典范的RuntimeException(运转时异常)包含NullPointerException, ClassCastException(范例转换异常),IndexOutOfBoundsException(越界异常), IllegalArgumentException(不法参数异常),ArrayStoreException(数组存储异常),AruthmeticException(算术异常),BufferOverflowException(缓冲区溢出异常)等;
非RuntimeException(搜检异常)包含IOException, SQLException,InterruptedException(中断异常-挪用线程就寝时刻),NumberFormatException(数字格式化异常)等。
而根据编译器搜检体式格局分别,异常又能够分为搜检型异常(CheckedException)和非搜检型异常 (UncheckedException)。Error和RuntimeException合起来称为UncheckedException,之所以这么 称谓,是由于编译器不搜检要领是不是处置惩罚或许抛出这两种范例的异常,因而编译时期涌现这类范例的异常也不会报错,默许由虚拟机供应处置惩罚体式格局。除了Error 和RuntimeException这两种范例的异常外,别的的异常都称为Checked异常。
Java怎样处置惩罚异常
1、try-catch, try-finally, try-catch-finally
关于checked范例异常,我们要么对它举行处置惩罚,要么在要领头运用throws抛出。
public static void createFile() throws IOException{ File file = new File("C:/test.txt"); if(!file.exists()){ file.createNewFile(); } } public static void main(String[] args) { try { createFile(); } catch (IOException ex) { // handle exception here } }
关于catch须要注重的几点:
1)、参数的异常范例必需是Throwable类或许其子类。
2)、从上往下的catch语句,其参数范例必需根据从子类到父类递次,由于一旦匹配到一个范例,就会疏忽今后的catch。比方IOException必需放到Exception前面,不然编译器会报错。
3)、能够有一个或许多个catch语句,以至假如有finally语句的状况下,能够没有catch语句,如try-finally。
想要捕捉多个异常,能够运用多个catch语句,JDK7今后供应了别的一种体式格局:多重捕捉(multi-catch)。
try{ // other code } catch (IOException | SQLException ex) { throw ex; }
4)、不要疏忽异常。空的catch块会使异常达不到应有的目标,除非诸如封闭FileInputStream的时刻,由于你还没有转变文件的状况,因而没必要实行任何恢复行动,而且已从文件中读取到所须要的信息,因而不必停止正在举行的操纵。
关于finally须要注重的几点:
1)、finally中的代码总是会被实行,除非在实行try或许catch语句时虚拟机退出(System.exit(1))。
2)、finally块能够做一些资本清算事情,如封闭文件、封闭游标等操纵。
3)、finally块不是必需的。
别的,假如在try和finally块中都实行了return语句,终究返回的将是finally中的return值。
2、异常链
经常想要在捕捉一个异常后抛出别的一个异常,而且愿望把原始异常信息保留下来,这就是异常链。在JDK1.4今后,Throwable子类在组织器 中能够接收一个cause对象作为参数,示意原始异常,经由过程如许把原始异常通报给新的异常,使得纵然在当前位置建立并抛出了新的异常,也能经由过程这个异常链 追踪到异常最初发作的位置。
但在Throwable子类中,只要Error, Exception, RuntimeException三类异常类供应了带cause参数的组织器,别的范例的异常则须要经由过程initCause()要领。比方定义了CustomException类,能够如许运用:
CustomException cmex = new CustomException(); cmex.initCause(new NullPointerException); throw cmex;
如许一来,CustomException继续自Exception或RuntimeException,就属于自定义异常了。
一般来说,自定义异常的作用有以下状况:
1)、将搜检型异常转换为非搜检型异常。
2)、在发生异常时封装上下文信息、定义异常码、网络环境对象,有利于信息的通报。
异常运用指南
1、在知道该怎样处置惩罚的状况下才捕捉异常。
2、自定义异常范例,用以封装一切的搜检型异常。
3、在递次的边境举行异常捕捉。如服务端响应客户端的要求,在出口处catch内部有能够发生的异常,并一致throw一个封装过的异常给客户端,以免暴露服务端敏感信息。
4、只针对异常的状况才运用异常。不要在一切的代码中习气性地运用try-catch,由于这会影响机能。
5、抛出与笼统相对的异常。假如要领抛出的异常与它实行的使命没有显著的联络,这类状况会使人手足无措。为了防止这个题目,更高层的完成应当捕捉 低层的异常,同时抛出能够根据高层笼统举行诠释的异常,这类做法被称为异常转译(exception translation),以下:
try{ // use lower-level abstraction to do our bidding } catch(LowerLevelException ex){ throw new HigherLevelException(...); }
别的一种特别的异常转译称为异常链,上面已作形貌。假如低层的异常关于调试致使高层异常的题目异常有协助,运用异常链就很适宜。高层的异常供应接见要领(Throwable.getCause)来取得低层的异常。
6、每一个要领抛出的异常要有文档形貌。应用Javadoc的@throws标记,纪录抛出每一个异常的前提。假如一个要领能够抛出多个异常,不要使 用这些异常类的某个超类。如不要声明一个要领“throws Exception”或“throws Throwable”,这将没有任何指点信息。
以上就是java什么是异常?的细致内容,更多请关注ki4网别的相干文章!