Java_异常
异常概述
- 异常,可以理解成程序中的一些错误,编译时与运行时都有异常的存在,比如除数为0就是一个简单的运行时异常,编译器就会在运行时报错,而且不会再去执行该条异常代码之后的代码语句。(本文中仅考虑程序运行中异常)
- 在Java程序运行中异常分为俩大类,一类为Error,一类为Exception。Error是一些比较大的异常,比如内存空间不足等,这不是我们能解决的,所以暂时不考虑。Exception是一些比较小的可以在程序中解决的异常,就比如上面的除数为0,就可以用try… catch…去抛出,抓取来解决。
异常解决
- 解决异常用的就是上面所提到的try… catch…组合来进行抛出,抓取,(其组合中还可添加finally作为必执行语句)格式如下
try{可能会出现异常的代码片段}
catch(异常类型 e){抓取异常成功后的执行语句}
finally{无论如何都会执行的语句} - try后面所跟的语句是可能会出现异常的代码片段,可以理解成让程序去注意这一片代码,如果其中出现异常,则会实例化出一个对应的异常对象,然后将其抛出。
- catch后面跟的一个形参,是该catch要抓取的异常类型,其要实施抓取的便是try所抛出的异常对象,如果不知道try所抛出的是哪一类型对象,可以考虑写多个catch去抓取不同类型的异常,也可以将catch的形参改成大多异常类的父类(Exception)进行抓取。
抓取成功之后便会执行catch之后所跟的代码语句,若失败(即该形参无法包括try所抛出的对象)则不执行后面所跟语句。
当有多个catch对一个try进行抓取时,范围大的catch应写在最后,否则会报错。
比如下图这样写就不会报错
而如下这样调换俩个catch顺序后报错
- finally后面所跟的是一定会执行的语句,finally需要try支持但不一定需要catch支持。无论是否发生异常finally都会执行,无论是否捕获异常finally都会执行。若发生异常,且没有捕获时,finally的执行在编译器报错之前。
异常处理举例
以下代码的执行结果表示出现异常之后,原程序不会再执行下去
int i=10/0;
System.out.println("异常之后执行");
- 以下代码及其执行结果表示异常被抛出但未被抓取效果与上面相似
try {
int i=10/0;
System.out.println("try中异常之后执行");
}
catch(NullPointerException e)
{
System.out.println(e.getMessage());
}
System.out.println("try之外执行");
- 以下代码及其执行结果表示异常被抛出且被抓取后,原程序继续执行,但try中写在异常语句之后的语句不会被执行
try {
int i=10/0;
System.out.println("try中异常之后执行");
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
System.out.println("try之外执行");
- 以下代码及其执行结果表示异常被抛出且被抓取后,finally会被执行
try {
int i=10/0;
System.out.println("try中异常之后执行");
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
finally {
System.out.println("finally执行");
}
System.out.println("try之外执行");
- 以下代码及其执行结果表示try抛出异常却未被抓取,finally会被执行
try {
int i=10/0;
System.out.println("try中异常之后执行");
}
catch(NullPointerException e)
{
System.out.println(e.getMessage());
}
finally {
System.out.println("finally执行");
}
- 以下代码及其执行结果表示try未抛出异常,finally会被执行
try {
int i=10/1;
System.out.println("try中异常之后执行");
}
catch(NullPointerException e)
{
System.out.println(e.getMessage());
}
finally {
System.out.println("finally执行");
}