处理异常
java语言把程序运行中可能遇到的错误分为2类:异常:一类非致命性的,通过某种修正后程序还能继续执行。 如打开一个文件时,发现文件不存在。又比如除零溢出,数组越界等
另一类是致命性的:程序遇到了非常严重的不正常状态,不能简单得恢复执行,这就是错误。 比如程序运行中内存耗尽。
-
A异常及其处理机制
未加处理的异常示例:源代码
public class HelloWorld
{
public static void main(String[] args)
{
int i=0;
String getting []={ //只含有3个元素的数组
"Hello World",
"No,I mean it!",
"HELLO WORLD!!"
};
while(i<4){
}
}
输出结果:
Hello World
No,I mean it!
HELLO WORLD!!
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3 at HelloWorld.main(HelloWorld.java:12)
简而言之,发现错误的代码可以抛出一个异常,程序员可以捕获该异常,如果可能则处理它,然后恢复程序的执行。
B异常分类
Java语言在所有的预设包中都定义了异常类和错误类。Exception类是所有异常类的父类,Error类是所有错误类的父类。这2个类又同时是Throwable类的子类。
Throwable在Java类库中 不需要import语句就可以使用。
异常语句分为3类
-
1受检异常 必须被处理
-
2运行时异常 不需要处理
-
3错误 不需要处理
1受检异常:是程序执行期间发生的严重事件的后果。
FileNotFoundException 程序从磁盘中读入数据,而系统找不到含有数据的文件。
ClassNotFoundException
IOException
NoSuchMethodException
WriteAbortedException
受检异常的所有类都是Exception的子类,Exception是Throwable的后代。
Resetting Index Value
e.toString()
This is always printed
2运行时异常:程序中逻辑错误的结果。
数组下标越界 ArrayIndexOutOfBounds
被o除 ArithmeticException
ClassCastException
IndexOutOfBoundsException
运行时异常的所有类都是类RuntimeException的子类,它是Throwable的后代
3错误:是标准类Error或其后代类的一个对象 Error是Throwable的后代。
一般地,错误是指发生了不正确的情况。如内存溢出。
运行时异常和错误称为不检行为
很多异常类都在包java.lang中,所以不需要引入
当有些异常类也需要引入
例如 当在程序中使用类IOException时,必须要引入语句:
import java.io.IOException
C异常处理
try{
//其他的代码
anObject.readString(...);可能抛出一个异常
//更多的其他的代码
}catch(IOException e){
//响应异常的代码 可能含义下面这行:
System.out.println(e.getMessage());
}
1.不管有没有try块,块中输入操作的运行都是一样的。如果没有发生异常,则try块内的语句全部执行,然后执行catch块后的语句。
2.如果在try块内发生了IOException异常,则执行立即转到catch块。此时已经捕获了异常。
3不论是否捕获了异常,都要执行finally后面的语句。
作为一个对象,每个异常都有存取方法getMessage() 它返回抛出异常时创建的描述字符串。
catch块执行完毕,执行它后面的语句。但如果问题很严重。则catch块可以调用exit()方法来中止程序。
System.exit(0)
-
正确的次序 将多个具体异常放在其祖先类的前面。
catch(FileNotFoundException e)
{......}
catch(IOException e) //处理所有其他IOException
{......}
finally实例:
try:{
startFaucet(); //某个方法
waterlawn(); //某个方法
}finally{
stopFaucet();
}
stopFaucet()方法总是被执行。try后面大括号的代码称为保护代码。
如果在保护代码内执行了System.exit()方法,将不执行finally后面的语句。这是不执行finally后面语句的唯一的一种可能。
添加异常处理的示例:
public class HelloWorld
{
public static void main(String[] args)
{
int i=0;
String getting []={ //只含有3个元素的数组
"Hello World",
"No,I mean it!",
"HELLO WORLD!!"
};
while(i<4){
try{
System.out.println(getting[i]);
}catch(ArrayIndexOutOfBoundsException e){
System.out.println("Resetting Index Value");
}catch(Exception e){
System.out.println(e.toString()); //e是错误异常类Exception类的一个实例;toString()是一个方法,它的作用是将变量由其它类型转变为字符串类型。
//这里System.out.println(e.toString())就是调用系统输入(System.Out)的println()方法,这个方法需要传入一个字符串类型的参数。
//这时,e.toString(),即把捕获的错误异常转变为字符串类型,传给println()方法,用以输入。
}finally{
System.out.println("This is always printed");
}
}//while循环结束
}//main主函数结束
}
-
2公共异常
1ArithmeticException int i=12/0; 整数除法中如果除数为零,则发生该异常。
2NullPointerException 如果一个对象还没有实例化 那么访问该对象或调用它的方法将导致这个异常
例如:
image im[]=new image[4]; //创建含有4个元素的数组01234,也可以理解为5个
System.out.println(im[0].toString()); //系统为其初始化都是null,所以访问im[0]会导致
NullPointerException
3NegativeArraySizeException:创建数组时,如果元素个数是负数
4ArrayIndexOutOfBoundException 数组下标越界
-
3 抛出异常
程序员处理异常有2种方法
1使用try块和catch块 捕获到所发生的异常类 并进行相应的处理。
2程序员不在当前方法内处理异常,而是把异常抛出到调用方法中。
在说明方法时,要使用如下格式:
访问权限修饰符 返回值类型 方法名(参数列表) throws 异常列表
紧接着在关键字throws后面的是该方法内可能方式且不进行处理的所有异常列表。
各异常列表之间以逗号隔开。例如:
public void troubleSome() throws IOException