7.1Java异常
任何一种程序设计语言的程序在运行时都有可能出现错误,例如除数为0,数组下标越界,要读写的文件不存在等。捕获错误最理想的是在编译期间,但有的错误只有在运行时才会发生。对于这些错误,一般有两种解决方式:
1、遇到错误就终止程序的运行
2、由程序员在编写程序时,就考虑到错误的检测、错误消息的提示,以及错误的处理
异常:在JAVA语言中,将程序执行中发生的不正常情况称为“异常”。Java中的异常用于处理非预期的情况,如文件没找到,网络错误,非法的参数
Java程序运行过程中所产生的异常事件可分为两类:
Error:JVM系统内部错误,资源耗尽等严重情况
Exception:其他因编程错误或偶然的外在因素导致的一般性问题,例如:空指针访问、试图读取不存在的文件、网络连接中断
7.2Java异常类层次
7.3Java异常处理机制
Java采用异常处理机制,将异常处理的程序代码集中在一起,与正常的程序代码分开,使得程序简洁,并易于维护。
try{
}catch(Exception e){
}finally{
}
Java提供的是异常处理的抓抛模型
java程序的执行过程中如出现异常,会自动生成一个异常对象类,该异常对象将被提交给Java运行时系统,这个过程称为抛出(throw)异常,如果一个方法内抛出异常,该异常会被抛到调用方法中。如果异常没有在调用方法中处理,他继续被抛给这个调用方法的调用者,这个过程将一直继续下去,直到异常被处理。这一过程称为捕获(catch)异常,如果一个异常回到main()方法,并且main()也不处理,则程序运行终止,程序员通常只能处理exception,而对error无能为力。
public class Test{
public static void main(String[] args) {
int i=0;
try{//可能包含异常的代码块
System.out.println(3/i);
}catch(Exception e){
e.printStackTrace();//告知异常类型
System.out.println(e.getMessage());
}finally {
System.out.println("NO!!");//最终会执行的代码
}
System.out.println("OK");
}
}
多个catch
public class Test{
public static void main(String[] args) {
String []strings=new String[]{"a","b"};
A a=null;
try{//在捕获异常的代码块中,如果前边的代码有异常了,就不会执行后边了,捕获到System.out.println(strings[2]);的异常之后,后边的两个输出语句就不会执行了
System.out.println(strings[2]);//数组越界
System.out.println("_____");
System.out.println(a.i);//空指针异常
}catch (ArrayIndexOutOfBoundsException e1){
System.out.println(e1.getMessage());
e1.printStackTrace();
} catch (NullPointerException e2){
System.out.println(e2.getMessage());
e2.printStackTrace();
}finally {
System.out.println("NO!!");
}
System.out.println("OK");
}
}
class A{
public int i;
}
7.4捕获异常
try
捕获异常的第一步是用try{...}语句选定捕获异常的范围 ,将可能出现异常的代码放在try语句块中 。
catch
在catch语句块中是对异常对象进行处理的代码。每个try语句块可以伴随一个或多个catch语句,用于处理可能产生的不同类 型的异常对象。 如果明确知道产生的是何种异常,可以用该异常类作为catch的参数:也可以用其父类作为catch参数。可以用ArithmeticException类作为参数,也可以用RuntimeException类作为参数,或者用所以异常的父类Exception类作 为参数。但不能是与ArithmeticException类无关的异常,如NullPointerException,那么,catch中的语句将不会执行。
捕获异常的有关信息:
getMessage()方法,用来得到有关异常事件的信息
printStackTrace()方法,用来跟踪异常事件发生时执行堆栈的内容
finally
获异常的最后一步是通过finally语句为异常处理提供一个统一的出口,使得在控制流转到程序的其他部分以前,能够对程 序的状态作统一的管理。不论在try、catch代码块中是否发生了异常,finally块中的语句都会被执行。 finally语句是可有可无的。
7.5抛出异常
声明抛出异常是java异常处理的第二种方式。
如果一个方法(中的语句执行时)可能生成某种异常,但是并不能确定如何处理这种异常,则此方法应显式的声明抛出异常,表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理。
在方法声明中用throws子句可以声明抛出异常的列表,throws后面的异常类型可以是方法中产生的类型异常,也可以是他的父类。
声明抛出异常案例:
public void readFile(String file)throws FileNotFoundException{
...
//读文件的操作可能产生FileNotFoundException类型的异常
FileInputStream fileInputStream=new FileInputStream(file);
}
public class Test {
public static void main(String[] args)/*throws Exception*/ {//可以在main方法中抛出异常,抛给JVM虚拟机
B b=new B();
try{//将throws抛出的异常捕获处理
b.test();
}catch (Exception e){
System.out.println(e.getMessage());
e.printStackTrace();
}
}
public static class B{
public int i;
public void test()throws Exception{
B b=null;
System.out.println(b.i);
}
}
}
重写方法声明抛出异常的规则 :重写方法不能抛出比被重写方法范围更大的异常类型 。
import java.io.FileNotFoundException;
import java.io.IOException;
public class A{
public void method()throws IOException{
...;
}
}
public class B extends A{
public void method()throws FileNotFoundException{
...;
}
}
public class C extends A{
public void method()throws Exception{//错误,重写方法抛出了比IOException更大范围的Exception
...;
}
}
7.6人工抛出异常
人工抛出异常:
java异常类对象除在程序执行过程中出现的异常时由系统自动生成并抛出,也可以根据需要人工创建并抛出首先要生成异常类对象,然后通过throws语句实现抛出操作(提交给java运行环境)。
IOException e=new IOException();
throw e;
可以抛出的异常必须是Throwable或其他子类的实例。下面的语句在编译时将会产生语法错误:throw new String ("want to throw");
public class B {
int age;
public void test(int age)throws Exception{
if(age>=0&&age<=100){
this.age=age;
}else {
throw new Exception("age error!!!");
}
}
}