深入理解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++11新特性之宽窄字符转换

    C++11增加了unicode字面量的支持,可以通过L来定义宽字符:str::wstringstr=L"中国人";将宽字符转换为窄字符串需要用到codecvt库中的std:

    2021年12月28日
    43
  • SpringBoot面试题大汇总附答案,SpringBoot面试题-持续更新中「建议收藏」

    SpringBoot面试题大汇总附答案,SpringBoot面试题-持续更新中「建议收藏」2021最新SpringBoot面试题【附答案解析】SpringBoot面试题及答案2021,SpringBoot2021最新面试题及答案,SpringBoot面试题新答案已经全部更新完了,有些答案是自己总结的,也有些答案是在网上搜集整理的。这些答案难免会存在一些错误,仅供大家参考。如果发现错误还望大家多多包涵,不吝赐教,谢谢~SpringBoot最新面试题大汇总,附答案其实,博主还整理了,更多大厂面试题,直接下载吧下载链接:高清172份,累计7701页大厂面试题PDF1、SpringBoo

    2022年6月7日
    49
  • laravel 预加载特定的列

    laravel 预加载特定的列

    2021年11月9日
    54
  • vscode查看源代码_vscode新建python项目

    vscode查看源代码_vscode新建python项目最近从pycharm转到了VScode,但是发现vscode不能跳转到源码,百度之后发现要装一个vscode的python的插件,插件就是「Pylance」。装好这个插件后应该可以使用pycharm一样的快捷方式连接到每个组件的源代码了,具体操作是:1.如果是windows系统,按住Ctrl键+鼠标点击待查看的方法或者类名2.如果是mac系统,按住Command键+…

    2022年8月23日
    29
  • 2.5.1大礼包

    2.5.1大礼包查找:全局搜索 prefs:root=或者 openURL:不要有“prefs:root=xxxx”这个可能出在自己项目中,特别是接手老项目,另一种可能是第三方sdk里出现的特别是调用相册相机调用wifi这类的第三方框架或SDK。如果第三方出现重新下载最新的包或者换第三方,联系第三方sdk开发者修改。修改一般只弹框提示不做跳转或者用苹果提供的方法。不要出现:@"pre…

    2022年7月16日
    16
  • 迅雷修改tracker服务器,qBittorrent 添加自定义 Tracker 的方法[通俗易懂]

    迅雷修改tracker服务器,qBittorrent 添加自定义 Tracker 的方法[通俗易懂]之前一直用uTorrent,前几天试了下qBittorrent之后,发现qBittorrent更容易添加自定义Tracker地址。uTorrent还需要每次添加或者修改Tracker服务器地址,而qBittorrent可以设置自动添加Tracker地址,而不需要每次下载都添加了。方法很简单:1.打开qBittorrent之后,点击工具→选项:2.在打开的界面中点击左…

    2022年9月27日
    3

发表回复

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

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