异常类分为以下:
异常处理方法:
1.捕获并处理异常
try catch finally 语句
说到这里,其实我到异常的处理还是一知半解的,直到我遇到这样的一道题:
public abstract class Test {
public static void main(String[] args) {
System.out.println(beforeFinally());
}
public static int beforeFinally(){
int a = 0;
try{
a = 1;
return a;
}finally{
a = 2;
}
}
}
//输出结果为1
从结果上看,貌似`finally` 里的语句是在`return` 之后执行的,其实不然,实际上`finally` 里的语句是在`return` 之前执行的。那么问题来了,既然是在之前执行,那为什么`a` 的值没有被覆盖了?
实际过程是这样的:当程序执行到try{}语句中的return方法时,它会干这么一件事,将要返回的结果存储到一个临时栈中,然后程序不会立即返回,而是去执行finally{}中的程序, 在执行`a = 2`时,程序仅仅是覆盖了a的值,但不会去更新临时栈中的那个要返回的值 。执行完之后,就会通知主程序“finally的程序执行完毕,可以请求返回了”,这时,就会将临时栈中的值取出来返回。这下应该清楚了,要返回的值是保存至临时栈中的。而且`finally` 里的语句是在`return` 之前执行的。
再来看一个例子,稍微改下上面的程序:
public abstract class Test {
public static void main(String[] args) {
System.out.println(beforeFinally());
}
public static int beforeFinally(){
int a = 0;
try{
a = 1;
return a;
}finally{
a = 2;
return a;
}
}
}
//输入2
这里为什么返回的又是2呢?因为finally{}里也有一个return,那么在执行这个return时,就会更新临时栈中的值。同样,在执行完finally中的return之后,就会通知主程序请求返回了,即将临时栈中的值取出来返回,此时程序结束不会再执行try{}中的return了,故返回值是2。
return的两个作用:1.返回临时栈中的值,2.结束运行,不再执行后面的代码。
2.将方法中产生的异常抛出
throw throws
第一种方式是自己处理异常,第二种方式是把异常抛出,交给调用它的程序去处理。
代码演示两种处理方式:
public class ListOfNumbers {
private ArrayList<Integer> list;
private static final int size = 10;
public ListOfNumbers() {
list = new ArrayList<Integer>();
for (int i = 0; i < size; i++) {
list.add(new Integer(i));
}
}
// 将list保存到OutFile.txt
public void WriteList() {
PrintWriter out=null;
try {
System.out.println("entering try statement");
out = new PrintWriter("OutFlie.txt");
for (int i = 0; i < size; i++) {
out.println("value at" + i + "=" + list.get(i));
System.out.println(list.get(i));
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (ArrayIndexOutOfBoundsException e) {
e.getMessage();
} finally {
System.out.println("close");
out.close();
}
}
}
class Test {
public static void main(String[] args) {
ListOfNumbers list = new ListOfNumbers();
list.WriteList();
}
}
class ListOfNumbersDeclared {
private Vector<Integer> victor;
private static final int size = 10;
public ListOfNumbersDeclared() {
victor = new Vector<Integer>(size);
for (int i = 0; i < size; i++) {
victor.addElement(new Integer(i));
}
}
// 声明异常抛出
public void WriteList() throws IOException, ArrayIndexOutOfBoundsException {
PrintWriter out = new PrintWriter(new FileWriter("OutFlie.txt"));
for (int i = 0; i < size; i++) {
out.println("value at" + i + "=" + victor.get(i));
System.out.println(victor.get(i));
}
out.close();
}
}
class Test{
public static void main(String[] args) {
try{
ListOfNumbersDeclared list=new ListOfNumbersDeclared();
list.WriteList();
}catch(Exception e){
}
System.out.println("无异常");
}
}