Exception:处理异常的两种方式

   上一篇介绍了异常的分类,主要介绍了运行时异常与非运行时异常常见的异常类,现在大概说一下异常的两种处理方式。

异常的处理方式,有些人分了好几类,throws、try……catch、try……catch……finally、try……finally等,我就把后面的合成一类吧。一般处理异常,我们都是处理非运行时异常,运行时异常是有我们代码不规范或者是疏忽原因造成的,我们不去处理,非运行时异常,我们采用这两种方式中的其中一种来处理。

throws,是我们不做处理,将异常一直往上抛,直到最顶层,再去处理,而try……catch是我们捕获其异常信息,然后再做出对应的处理。

 拿下面的这个简单的例子来介绍这两种异常:

<span style="font-size:14px;">	public static void main(String[] args) {
		method();
	}

	private static void method() {
		int a = 10;
		int b = 0;
		System.out.println(a/b);
		System.out.println("stope");
	}</span>
try……catch……

try……catch的格式为:try{……}catch (异常对象 e){数据处理}。上面的程序运行时,会提示一个ArithmeticException,这个异常的父类是RuntimeException,不是说运行时异常我们不做处理吗?为什么还要对它进行处理呢?运行时异常我们一般不处理,但是我们也是可以去处理的。在这儿我为了方便体现,就先用它来做一个简单的实例。

先看看上面代码的运行结果:

<span style="font-size:14px;">Exception in thread "main" java.lang.ArithmeticException: / by zero
	at collection.TestStack.methed(TestStack.java:12)
	at collection.TestStack.main(TestStack.java:6)
</span>

控制台打印的异常信息,是由java虚拟机在执行的过程中自动去做的处理,在method方法里面,我最后打印了一个stop的字符串,但是控制台上并没有显示,这就是java虚拟机处理的一个特点,只要它遇到异常,它就停止向下执行,并把异常信息输出到控制台。而我们有时候,不希望出异常的那块代码影响了我们后面的程序,所以,我们一般会采取自己处理的方式,来让下面的代码继续执行。具体就是用try……catch去处理,代码及运行结果如下:

<span style="font-size:14px;">	public static void main(String[] args) {
		methed();
	}

	private static void methed() {
		int a = 10;
		int b = 0;
		try{
			System.out.println(a/b);
		} catch (Exception e) {
			System.out.println("这一行出现了错误");
		}
		System.out.println("stope");
	}</span>
<span style="font-size:14px;">这一行出现了错误
stope
</span>
这样就可以避免,遇到异常,后面的程序不能继续执行了。但是这样做毫无意义,虽然它有提示这儿出了异常,但是我们是要知道异常的具体信息,以方便我们去调试解决。所以,有必要去了解一下异常类里面的方法。看了一下API,所有异常的超类是Throwable,在这个类里面有几个方法,还是可以去看一看的。

getMessage():Returns the detail message string of this throwable

toString():Returns a short description of this throwable

printStackTrace():Prints this throwable and its backtrace to the standard error stream

大概介绍一下这三个方法,上面是三个方法的官方介绍,getMessage()是获取异常信息,返回的结果是:/ by zero,toString返回的结果是:java.lang.ArithmeticException: / by zero,再看看最后的printStackTrace输出的结果:

java.lang.ArithmeticException: / by zero
at collection.TestStack.methed(TestStack.java:13)
at collection.TestStack.main(TestStack.java:6)
它综合了前面两种方式,并且告诉了出错的行数,而且还不影响后面代码的执行。

try……catch的主要作用是对发生的异常进行一个响应,在web开发中,常在catch中,定义一个Message类,将错误信息以符合访问者的字符去返回到前台页面。在try……catch……后面还有finally,主要是用来释放资源,在使用try……catch的时候,一定要尽可能的少写代码,因为try里面存在一句代码,就需要给一部分资源去处理它,这样很容易浪费资源。还有尽可能的在catch中制定具体的异常类,比如上面那个例子,在catch中,最好推荐去写(ArithmeticException e),这样做的好处是能提高效率。以前一直不明白,Exception是他们的父类,为什么不用Exception而要指定具体的异常对象呢。今天才知道,Exception下面有很多子类,当你用Exception去处理异常时,它要从它的子类中去查找能处理它的异常类,这样必然会降低效率。

如果有多个异常,try……catch也可以多次捕获。具体用下面的例子体现:

<span style="font-size:14px;">	public static void main(String[] args) {
		methed();
	}

	private static void methed() {
		int a = 10;
		int b = 0;
		int[] array = new int[2];
		try{
			System.out.println(a/b);
			System.out.println(array[3]);
		} catch (ArithmeticException e) {
			e.printStackTrace();
		} catch (ArrayIndexOutOfBoundsException e){
			e.printStackTrace();
		}
		System.out.println("stope");
	}</span>

这儿要特别说明的是,不能讲父类写在前面,否则编译不会通过。

<span style="font-size:14px;"><span style="white-space:pre">		</span>try{
			System.out.println(a/b);
			System.out.println(array[3]);
		} catch (Exception e) {
			e.printStackTrace();
		} catch (ArithmeticException e) {
			e.printStackTrace();
		} catch (ArrayIndexOutOfBoundsException e){
			e.printStackTrace();
		}</span>
这是因为,第一个Exception已经处理了所有的异常,而它的子类就不需要再去处理,所以后面的代码将永远不能被执行,所以编译器在编译前,就会提示错误。

throws

它的主要是我现在暂时不能处理,我将这个异常抛到上级,让上级去处理,如果上级也处理不了的,将继续向上抛,如果最终都不能处理,将会通过java虚拟机去处理。具体下次补全。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值