简介
措施运行时,产生的不被期望的事件,它阻止了措施凭据措施员的预期正常执行,这就是异常。异常产生时,是任措施自生自灭,立即退出终止,照旧输堕落误给用户?可能用C语言气势气魄:用函数返回值作为执行状态?。
Java提供了越发优秀的办理步伐:异常处理惩罚机制。
异常处理惩罚机制能让措施在异常产生时,凭据代码的预先设定的异常处理惩罚逻辑,针对性地处理惩罚异常,让措施尽最大大概规复正常并继承执行,且保持代码的清晰。
Java中的异常可以是函数中的语句执行时激发的,也可以是措施员通过throw 语句手动抛出的,只要在Java措施中发生了异常,就会用一个对应范例的异常工具来封装异常,JRE就会试图寻找异常处理惩罚措施来处理惩罚异常。
Throwable类是Java异常范例的顶层父类,一个工具只有是 Throwable 类的(直接可能间接)实例,他才是一个异常工具,才气被异常处理惩罚机制识别。JDK中内建了一些常用的异常类,我们也可以自界说异常。
Java异常的分类和类布局图
Java尺度裤内建了一些通用的异常,这些类以Throwable为顶层父类。
Throwable又派生出Error类和Exception类。
错误:Error类以及他的子类的实例,代表了JVM自己的错误。错误不能被措施员通过代码处理惩罚,Error很少呈现。因此,措施员应该存眷Exception为父类的分支下的各类异常类。
异常:Exception以及他的子类,代表措施运行时发送的各类不期望产生的事件。可以被Java异常处理惩罚机制利用,是异常处理惩罚的焦点。
![858860-20170911125844719-1230755033 因为下面的finally中利用了return); }finally { return 100; } } //try中的异常被抑制 @SuppressWarnings(finally) public static int bar() throws Exception { try { int a = 5/0; return 1; }finally { return 100; } }} finally中的异常会包围(没落)前面try可能catch中的异常 class TestException{ public s 昆山软件开拓 tatic void main(String[] args) { int result; try{ result = foo(); } catch (Exception e){ System.out.println(e.getMessage()); //输出:我是finaly中的Exception } try{ result = bar(); } catch (Exception e){ System.out.println(e.getMessage()); //输出:我是finaly中的Exception } } //catch中的异常被抑制 @SuppressWarnings(finally) public static int foo() throws Exception { try { int a = 5/0; return 1; }catch(ArithmeticException amExp) { throw new Exception(我将被忽略](/uploads/allimg/c170916/1505534MSU10-1H05.png)
总体上我们按照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 )
*****************************************/