在实际应用中,异常是个高频热词,比如:用户的输入不符合要求;打开文件,文件却不存在或格式不对等。
异常(Exception)大致分为检查性异常和运行时异常。检查性异常是指由于用户错误或问题而引起的异常,编译时不能简单地忽略。运行时异常,由于程序逻辑错误而引发,与编程人员相关,编译时可被忽略。
在Java中,定义了一个基类:java.lang.Throwable 作为所有异常的超类(最顶层的类)。因此,异常也被当作对象来处理。
常见的异常分类,如下图所示。
补充:错误(ERROR),不是异常
错误类对象由Java虚拟机(JVM)生成并抛出,大多数的错误与编程人员的操作无关。
常见的错误有:OutOfMemoryError --> JVM内存不足、NoClassDefFoundError-->定义错误、LinkageError-->链接错误等。
错误通常是灾难性的致命错误,是程序无法控制和处理的,当出现这种情况时,Java虚拟机一般会选择中止线程。
运行时异常是不检查异常,程序中可以选择捕获处理或者不处理。异常通常情况下是可以被程序处理的,并且在程序中应该尽可能地去处理这些异常。
异常处理机制可分为两类:抛出异常和捕获异常。
捕获异常的关键字有:try、catch、finally。
try --> 创建了一片监控区域 :监控其中的方法使用是否存在异常。
catch --> 捕获异常 :捕获想要捕获的异常,并对所捕获的异常进行相关操作。
finally --> 处理善后工作 :如IO流、资源的关闭。
注:finally无论是否有异常,都会执行!!!
具体捕获异常方法,如下图所示。
catch( ){ }也可以书写多个,但要注意层层递进,大异常写下面。如下图所示。
注:可使用ctrl + alt + t自动生成try/catch/finally结构,如下图所示。
补充:
.printStackTrace()方法可用于打印错误栈信息。
System.exit(参数)可用于程序结束。其中参数0表示正常退出程序,即:按照我们预想的执行,最后停止程序。参数1(或其他非0参数)表示非正常退出程序,如:当捕获到异常,需要停止程序。一般来说,catch块中使用System.exit(1)来退出。
抛出异常的关键字有:throw、throws
throw --> 在方法中主动抛出异常,可以在方法中使用try-catch语句来捕获异常。 如下图所示。
throws --> 方法中处理不了这个异常,就从这个方法的声明处通过throws关键字指明要抛出方法调用者的异常,之后在出现异常方法的调运处中捕获并处理该异常。 如下图所示。
用户自定义异常类,只需要继承Exception类即可。如下图所示。
使用自定义异常,具体效果如下所示。
对于异常,应该合理规避的同时使try-catch语句因地制宜的辅助处理。
在多重catch块后,用一个catch大异常来处理可能会被遗漏的异常。
对于不确定的代码,也可以加上try-catch来处理潜在异常。
尽量添加finally语句块来释放占用资源。