深入理解try catch吃掉异常,及catch(Exception e)中的异常

深入理解try catch吃掉异常,及catch(Exception e)中的异常

package test.s;
public class yichang {
	
	public static void main(String[] args) throws Exception{
		try{
			double a=aa();
			System.out.println(a);
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	
	public static double aa() throws Exception{
		double b = 0;
		try{
			b=1/0;
		}catch(Exception e){
			throw new Exception(e.getMessage());
		}
		return b;
	}

}

输出:

java.lang.Exception: / by zero
	at test.s.yichang.aa(yichang.java:18)
	at test.s.yichang.main(yichang.java:6)

说明:这算是比较正常的异常写法。aa()方法抛出异常,mian方法捕获异常,并打印出异常原因。

2,

package test.s;
public class yichang {
	
	public static void main(String[] args) throws Exception{
		try{
			double a=aa();
			System.out.println(a);
		}catch(Exception e){
		}
	}
	
	public static double aa() throws Exception{
		double b = 0;
		try{
			b=1/0;
		}catch(Exception e){
			throw new Exception(e.getMessage());
		}
		return b;
	}

}

没有输出;

说明:这个跟1的区别是main方法捕获aa传来的异常后没有将异常打印出来,所以没有任何输出。

3,

package test.s;
public class yichang {
	
	public static void main(String[] args) throws Exception{
		try{
			double a=aa();
			System.out.println(a);
		}catch(NullPointerException e){
			e.printStackTrace();
		}
	}
	
	public static double aa() throws Exception{
		double b = 0;
		try{
			b=1/0;
		}catch(Exception e){
			throw new Exception(e.getMessage());
		}
		return b;
	}

}

输出:

Exception in thread "main" java.lang.Exception: / by zero
	at test.s.yichang.aa(yichang.java:18)
	at test.s.yichang.main(yichang.java:6)

说明:在主方法中的catch(nullPointerException e)是空指针异常。而aa()方法抛出来的异常是
ArithmeticException,所以main方法虽然用try catch把aa()方法包裹起来,但是并没有捕获改异常。控制台打印的是java自己处理打印出来的异常。

效果跟下面的代码是一样的:也就是main方法中不用try catch

package test.s;
public class yichang {
	
	public static void main(String[] args) throws Exception{
			double a=aa();
			System.out.println(a);
	}
	
	public static double aa() throws Exception{
		double b = 0;
		try{
			b=1/0;
		}catch(Exception e){
			throw new Exception(e.getMessage());
		}
		return b;
	}

}

4,

package test.s;
public class yichang {
	
	public static void main(String[] args) throws Exception{
		try{
			double a=aa();
			System.out.println(a);
		}catch(NullPointerException e){
			e.printStackTrace();
		}
	}
	
	public static double aa() throws Exception{
		double b = 0;
		try{
			b=1/0;
		}catch(NullPointerException e){
			throw new NullPointerException(e.getMessage());
		}
		return b;
	}

}

输出:

Exception in thread "main" java.lang.ArithmeticException: / by zero
	at test.s.yichang.aa(yichang.java:16)
	at test.s.yichang.main(yichang.java:6)

说明这种是catch(NullPointerException e),在aa方法中只能捕获空指针异常,但是b=1/0报的是算术异常,因此也是无法捕获的。使用debug跑程序会发现程序运到b=1/0就打印异常结束程序了。

因此同以下代码:

package test.s;
public class yichang {
	
	public static void main(String[] args){
			double a=aa();
			System.out.println(a);

	}
	
	public static double aa() {
		double b = 0;
			b=1/0;

		return b;
	}

}

5,

	package test.s;
	public class yichang {
		
		public static void main(String[] args) throws Exception{
			try{
				double a=aa();
				System.out.println(a);
			}catch(NullPointerException e){
				e.printStackTrace();
			}
		}
		
		public static double aa() throws Exception{
			double b = 0;
			try{
				b=1/0;
			}catch(ArithmeticException e){
				throw new ArithmeticException(e.getMessage());
			}
			return b;
		}
	
	}

输出:

Exception in thread "main" java.lang.ArithmeticException: / by zero
	at test.s.yichang.aa(yichang.java:18)
	at test.s.yichang.main(yichang.java:6)


说明:这中情况也很明显了。aa方法中的try catch 能捕获异常,但是mian方法中的try catch不行

6,最准确的情况

	package test.s;
	public class yichang {
		
		public static void main(String[] args) throws Exception{
			try{
				double a=aa();
				System.out.println(a);
			}catch(ArithmeticException e){
				e.printStackTrace();
			}
		}
		
		public static double aa() throws Exception{
			double b = 0;
			try{
				b=1/0;
			}catch(ArithmeticException e){
				throw new ArithmeticException(e.getMessage());
			}
			return b;
		}
	
	}

输出:

java.lang.ArithmeticException: / by zero
	at test.s.yichang.aa(yichang.java:18)
	at test.s.yichang.main(yichang.java:6)

说明:因为知道aa方法抛出的异常是ArithmeticException,所以准确定位第一层异常捕获。然后在main方法中也精确捕获到aa方法抛来的算术异常。


总结,正确使用try catch 异常,try 不是能吃掉所有的异常,必须要在catch中使用正确的异常才能捕获。但是在实际开发中,很难精确的捕获可能存在的异常。因此我们大多使用第一种情况,exception是所有异常的父类,能捕获到所有的异常。

新增:对于方法套嵌层级很多的,如果在最外层的方法被try catch,那么无论多少层级,最后都会被最外层的try catch捕获到,比如说在实际工作中我们经常会看到这样的代码,最外层的方法被try catch,如果有个方法出现空指针异常,那么最后打印的信息会是最外层catch输出的错误说明。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/106250.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 正则表达式相关:C# 抓取网页类(获取网页中所有信息)

    类的代码:调用:转自:http://hovertree.com/h/bjaf/jhvb7drd.htm推荐:http://www.cnblogs.com/roucheng/p/3521864.h

    2021年12月22日
    43
  • iphone手机获取不了软件_手机uuid什么意思

    iphone手机获取不了软件_手机uuid什么意思UDID是一种iOS设备的特殊识别码。除序号之外,每台iOS装置都另有一组独一无二的号码,我们就称之为识别码(UniqueDeviceIdentifier,UDID)。每个iOS开发者在缴交99美元年费的同时,都会得到100个betatest名额,可以让软件开发者输入100台iOS装置的UDID。有意成为betatester的人,只需向开发者提交UDID,经过输入及制成一个描述

    2022年8月9日
    29
  • Android开发环境搭建

    Android开发环境搭建Android开发环境搭建可以分为以下四步:第一步、安装JDK;第二步、安装Eclipse;第三步、下载并安装AndroidSDK;第四步、为Eclipse安装ADT插件下面详细介绍。第一

    2022年7月1日
    27
  • pytest重试_pytest失败重跑

    pytest重试_pytest失败重跑安装:pip3installpytest-rerunfailures重新运行所有失败用例要重新运行所有测试失败的用例,请使用–reruns命令行选项,并指定要运行测试的最大次数:$py

    2022年7月29日
    15
  • 用KCPTun进行加速

    用KCPTun进行加速来源:https://blog.csdn.net/Crapefruit/article/details/86669794VPS端在命令行键入:mkdirkcptuncdkcptunwget

    2022年8月4日
    56
  • Google虚拟机_免费google账号

    Google虚拟机_免费google账号 GoogleAppEngine是Google推出的免费虚拟主机空间,其实这比一般虚拟主机强悍的多,你可以利用GoogleAppEngine工具来开发网站或制作网络应用程序,Google会在自己的庞大服务器集群上为你提供空间、带宽、资源等。目前GoogleAppEngine为每个用户提供10个Application(简称App),每个App有500M免费空间,每个App限制100

    2022年10月15日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号