java异常处理

异常类分为以下:

 

异常处理方法:

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("无异常");
			
		}
	}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值