在java中提供了一个throwable接口,其中错误和异常都是对于这个接口的实现。
对于错误来说,程序员通常无能为力,一旦发生,只能想办法让程序优雅的退出。例如,常见的错误有:
VirtualMachineError:java虚拟机运行错误,或者虚拟机运行不能得到足够资源
OutOFMemoryError:因为内存越界java虚拟机不能定位对象,或者内存不足,不能进行垃圾回收时抛出
StackOverflowError:栈溢出时抛出
LinkageError:两个类之间存在依赖关系,当被依赖的类发生变化是抛出
由于错误的发生程序猿无能为力,我们能做的就只能是去关注异常,对于特定的异常进行处理。
异常分为运行时异常和其他异常两种。运行时异常是由程序员在代码里处理不当造成的是unchecked的,而其他异常是由外部原因造成,是checked的。
下面说一下checked异常和unchecked异常的区别:
checked异常必须被捕获,并指定错误处理器handler,否则编译无法通过。
unchecked异常可以不处理,编译时不会出现问题,但是执行时出现就会导致程序失败。
unchecked异常的出现实际就是因为我们对于代码的处理不当造成的,因此我们可以通过改变代码来消除这些异常。而对于checked异常,其由外部原因造成,大部分是用户操作不当,对于这个问题我们不能很好的方法,因此应该对于checked异常额外重视。有关checked异常的关键字主要有
try
catch
finally
throws
throw
其使用就类似于:
将可能抛出异常的代码段放在try中,然后用下面的catch捕获异常,由于我们在程序中可能对于很多资源进行了申请,一旦程序抛出异常,try中抛出异常语句后面的语句都不会被执行,而是直接跳到catch语句,这就可能造成很多资源没有被合理的关闭,这个时候finally就发挥了作用,无论是否有异常发生,finally都会被执行,因此可以将那些关闭资源的语句放在finally中被执行。
对于throw,他的作用是对于异常进行抛出,例如
Exception e = new exception;
throw e;
而throws是在类或方法中,声明我的类或方法可能抛出什么异常,将这些异常交由上一层进行处理。(注意,一个异常如果被catch捕获,就不用再在throws中进行声明,只有那些在本类中没有被处理的,希望上层函数对于这个异常进行处理的异常才应被抛出,并用throws进行声明。)