我也曾对Java异常一无所知

798 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

异常这部分很多人会蒙圈,原因或许在于没去了解异常是什么,它跟我们写程序过程中出现的bug是否是一个概念。不是话它是一个啥玩意?究其因果就是不知道他是什么。那么异常的定义到底是什么?在这篇文章中我认为异常这个概念对初学者来说是个比较模棱两可的点。处理异常的两种方式有什么不同?

1 异常

异常的概述:异常就是程序出现了不正常的情况 。异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。Java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。

2 JVM默认处理异常的方式

如果程序出现了问题,我们没有做任何处理,最终JVM 会做默认的处理,处理方式有如下两个步骤: 把异常的名称,错误原因及异常出现的位置等信息输出在了控制台 程序停止执行 。

3 try-catch方式处理异常

定义格式

     try{
	    可能会出现异常的代码;
	}catch(出现的异常类型  异常对象){
	   一般都是打印异常出现的位置;
	  但是,此位置如果try捕获了异常此位置才会执行!
	  如果try没有捕获异常,此位置代码不会执行!
	}

4 Throwable成员方法

常用方法:

5 编译时异常和运行时异常的区别

  • 编译时异常:都是Exception类及其子类 必须显示处理,否则程序就会发生错误,无法通过编译。
  • 运行时异常:都是RuntimeException类及其子类 无需显示处理,也可以和编译时异常一样处理。

6 throws方式处理异常

定义格式

public void 方法() throws 异常类名 {  
          
}

示例代码:

在这里给图片加点文字,便于理解。运行时异常是不受检的异常在31行代码我不throws出异常,程序一样不会报错。我们知道该方法抛出后,以后谁用这个方法就是谁来解决这个异常,那么其实运行时异常这么抛是没有意义的,到最后用的人还是自己,这个问题还是自己解决。编译时异常是受检异常,这里SimpleDateFormat里的自定义格式系统怕与24行的s有所不同,所以有这个异常。(这里异常是没有被捕捉到,因为是匹配的。)一样的method2抛出的异常在main中还是要由调用者解决,对于异常解决方式的选择,这里建议使用try...catch因为使用throws抛出异常,出现异常位置的下面所有代码是不会执行的,而try...catch处理异常是,try里面的所有代码是都会被执行的。 总结如下:

  • 这个throws格式是跟在方法的括号后面的
  • 编译时异常必须要进行处理,两种处理方案:try...catch …或者 throws,如果采用 throws 这种方案, 将来谁调用谁处理
  • 运行时异常可以不处理,出现问题后,需要我们回来修改代码

7 自定义异常

自定义异常类

老师类

测试类