深入理解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#彩色扭曲验证码

    C#彩色扭曲验证码该验证码生成类集合了网上大部分的验证码生成类的精华,并多次改进,现在已经形成了可在生产环节中使用的验证码。该验证码加入了背景噪点,背景噪点曲线和直线,背景噪点文字以及扭曲,调暗,模糊等。完全可以实现防识别。按照国际惯例先贴张效果图吧:#region验证码生成类//////验证码生成类///

    2022年7月21日
    12
  • 激光雷达:测距原理

    激光雷达:测距原理介绍了三角测距雷达及飞行时间雷达的测距原理

    2022年5月8日
    43
  • java微服务架构有哪些_漂浮服务区后端

    java微服务架构有哪些_漂浮服务区后端在本文中我们将主要研究目前主要的BaaS平台的功能,以及Google,Facebook,Apple等互联网巨头在BaaS领域的动作。同时我们也会关注国内一些主流BaaS平台的发展以及国内互联网巨头如百度,华为等在BaaS领域的投入发展。1.国外主流的BaaS平台 在BaaS领域,有几件事情值得关注:2013年4月,Facebook收购Parse;2013年12月,Paypal收…

    2025年5月27日
    0
  • win7设置电脑锁屏时间怎么设置_win7自动锁屏设置无效

    win7设置电脑锁屏时间怎么设置_win7自动锁屏设置无效方法/步骤1小编用的win7电脑,进入控制面板先~2选择系统与安全选项。3如图所示,箭头所指,可以设置锁屏时间,不过电源选项中还有个设置开启屏幕输入密码的设置,第一个就是。4如图所示,可以设置自动锁屏

    2022年8月5日
    6
  • mysql explain ref const_MySQL EXPLAIN 详解「建议收藏」

    mysql explain ref const_MySQL EXPLAIN 详解「建议收藏」一.介绍EXPLAIN命令用于SQL语句的查询执行计划。这条命令的输出结果能够让我们了解MySQL优化器是如何执行SQL语句的。这条命令并没有提供任何调整建议,但它能够提供重要的信息帮助你做出调优决策。先解析一条sql语句,你可以看出现什么内容EXPLAINSELECT*FROMperson,deptWHEREperson.dept_id=dept.didandper…

    2022年10月18日
    1
  • SpringCloud—解决雪崩效应之熔断

    SpringCloud—解决雪崩效应之熔断

    2020年11月12日
    223

发表回复

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

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