简介
措施运行时,产生的不被期望的事件,它阻止了措施凭据措施员的预期正常执行,这就是异常。异常产生时,是任措施自生自灭,立即退出终止,照旧输堕落误给用户?可能用C语言气势气魄:用函数返回值作为执行状态?。
Java提供了越发优秀的办理步伐:异常处理惩罚机制。
异常处理惩罚机制能让措施在异常产生时,凭据代码的预先设定的异常处理惩罚逻辑,针对性地处理惩罚异常,让措施尽最大大概规复正常并继承执行,且保持代码的清晰。
Java中的异常可以是函数中的语句执行时激发的,也可以是措施员通过throw 语句手动抛出的,只要在Java措施中发生了异常,就会用一个对应范例的异常工具来封装异常,JRE就会试图寻找异常处理惩罚措施来处理惩罚异常。
Throwable类是Java异常范例的顶层父类,一个工具只有是 Throwable 类的(直接可能间接)实例,他才是一个异常工具,才气被异常处理惩罚机制识别。JDK中内建了一些常用的异常类,我们也可以自界说异常。
Java异常的分类和类布局图
Java尺度裤内建了一些通用的异常,这些类以Throwable为顶层父类。
Throwable又派生出Error类和Exception类。
错误:Error类以及他的子类的实例,代表了JVM自己的错误。错误不能被措施员通过代码处理惩罚,Error很少呈现。因此,措施员应该存眷Exception为父类的分支下的各类异常类。
异常:Exception以及他的子类,代表措施运行时发送的各类不期望产生的事件。可以被Java异常处理惩罚机制利用,是异常处理惩罚的焦点。
总体上我们按照Javac对异常的处理惩罚要求,将异常类分为2类。
非查抄异常(unckecked exception):Error 和 RuntimeException 以及他们的子类。javac在编译时,不会提示和发明这样的异常,不要求在措施处理惩罚这些异常。所以假如愿意,我们可以编写代码处理惩罚(利用try…catch…finally)这样的异常,也可以不处理惩罚。对付这些异常,我们应该批改代码,而不是去通过异常处理惩罚器处理惩罚 。这样的异常产生的原因多数是代码写的有问题。如除0错误ArithmeticException,错误的强制范例转换错误ClassCastException,数组索引越界ArrayIndexOutOfBoundsException,利用了空工具NullPointerException等等。
查抄异常(checked exception):除了Error 和 RuntimeException的其它异常。javac强制要求措施员为这样的异常做预备处理惩罚事情(利用try…catch…finally可能throws)。在要领中要么用try-catch语句捕捉它并处理惩罚,要么用throws子句声明抛出它,不然编译不会通过。这样的异常一般是由措施的运行情况导致的。因为措施大概被运行在各类未知的情况下,而措施员无法过问用户如何利用他编写的措施,于是措施员就应该为这样的异常时刻筹备着。如SQLException , IOException,ClassNotFoundException 等。
需要明晰的是:查抄和非查抄是对付javac来说的,这样就很好领略和区分了。
初识异常
下面的代码会演示2个异常范例:ArithmeticException 和 InputMismatchException。前者由于整数除0激发,后者是输入的数据不能被转换为int范例激发。
package com.example; import java. util .Scanner ; public class AllDemo { public static void main (String [] args ) { System . out. println( "----接待利用呼吁行除法计较器----" ) ; CMDCalculate (); } public static void CMDCalculate () { Scanner scan = new Scanner ( System. in ); int num1 = scan .nextInt () ; int num2 = scan .nextInt () ; int result = devide (num1 , num2 ) ; System . out. println( "result:" + result) ; scan .close () ; } public static int devide (int num1, int num2 ){ return num1 / num2 ; } } /***************************************** ----接待利用呼吁行除法计较器---- 0 Exception in thread "main" java.lang.ArithmeticException : / by zero at com.example.AllDemo.devide( AllDemo.java:30 ) at com.example.AllDemo.CMDCalculate( AllDemo.java:22 ) at com.example.AllDemo.main( AllDemo.java:12 ) ----接待利用呼吁行除法计较器---- r Exception in thread "main" java.util.InputMismatchException at java.util.Scanner.throwFor( Scanner.java:864 ) at java.util.Scanner.next( Scanner.java:1485 ) at java.util.Scanner.nextInt( Scanner.java:2117 ) at java.util.Scanner.nextInt( Scanner.java:2076 ) at com.example.AllDemo.CMDCalculate( AllDemo.java:20 ) at com.example.AllDemo.main( AllDemo.java:12 ) *****************************************/