什么是异常
异常字面翻译就是“意外、例外”的意思,也就是非正常情况。
异常本质上是程序上的错误。
错误在我们编写程序的过程中会经常发生,包括编译期间和运行期间的错误。
在编译期间出现的错误有编译器帮助我们一起修正,然而运行期间的错误便不是编译器力所能及了,并且运行期间的错误往往是难以预料的。
异常的分类
在Java中,通过Throwable及其子类描述各种不同的异常类型.
Throwable有两个重要的子类:Exception 和 Error.
Error
Error是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。
例如,Java虚拟机运行错误(Virtual MachineError),当 JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError
这些错误是不可查的,因为它们在应用程序的控制和处理能力之外,而且绝大多数是程序运行时不允许出现的状况。
对于设计合理的应用程序来说,即使确实发生了错误,本质上也不应该试图去处理它所引起的异常状况。
因此我们编写程序时不需要关心这类异常。
Exception
Exception是程序本身可以处理的异常。异常处理通常指针对这种类型异常的处理。
Exception类的异常包括 checked exception 和 unchecked exception。
Unchecked Exception
编译器不要求强制处置的异常,包含RuntimeException类及其子类异常。
如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,这些异常是unchecked exception 。
Java编译器不会检查这些异常,在程序中可以选择捕获处理,也可以不处理,照样正常编译通过。
Checked Exception
编译器要求必须处置的异常,是RuntimeException及其子类以外,其他的Exception类的子类。
如IOException、SQLException等
Java编译器会检查这些异常,当程序中可能出现这类异常时,要求必须进行异常处理,否则编译不会通过。
异常处理中的返回操作
System.exit(参数);
语法:方法表示终止当前运行的java虚拟机.其中,参数作为参数代码.非零状态码表示异常终止.
从表层运行结果来看,无论参数为何,程序都会直接退出。不同的数值代表的信息是传递给底层。如下图1所示,在catch中加入System.exit(1);
1 importjava.util.Scanner;2
3 public classexcReturnTest {4
5 public static voidmain(String[] args) {6 try{7 Scanner input = newScanner(System.in);8 System.out.println("请输入整数:");9 int i =input.nextInt();10 } catch(Exception e) {11 System.exit(1);12 System.out.println("catch");13 } finally{14 System.out.println("finally");15 }16
17 }18 }
当输入aaa时,如图所示,程序直接结束,不会继续执行输出catch和finally
return 返回值;
如果方法返回值为void,则return后无需加返回值,直接分号结束;通过return 返回值; 可以结束当前方法执行将返回值带回调用处。
return语句可以分别出现在try、catch以及finally块中,但是由于finally语句块一定要执行,所以当存在finally时,会先执行完finally中的代码再执行return。
1、如下图所示,主方法返回值为void,因此return之后可以无返回值;并在 try…catch…finally中都添加了return
public static voidmain1(String[] args) {try{
Scanner input= newScanner(System.in);
System.out.println("请输入整数:");int i =input.nextInt();
}catch(Exception e) {
System.exit(1);
System.out.println("catch");
}finally{
System.out.println("finally");
}
}
2、如下图所示,getResult方法返回值为int,分别在try…catch…finally中,通过return带回返回值。
public static voidmain(String[] args) {
System.out.println(getResult());
}public static intgetResult() {int temp = 10;try{
System.out.println("try");return temp + 1;
}catch(Exception e) {
System.out.println("catch");return temp + 2;
}finally{
System.out.println("finally");return temp + 3;
}
}
返回结果:
结合运行结果可以看出,程序无异常,依次输出try,finally中的文字,并输出finally中返回的结果。
3、如下图所示,getResult方法中去掉finally中的返回值。
public static voidmain(String[] args) {
System.out.println(getResult());
}public static intgetResult() {int temp = 10;try{
System.out.println("try");return temp + 1;
}catch(Exception e) {
System.out.println("catch");return temp + 2;
}finally{
System.out.println("finally");
}
}
返回结果:
结合运行结果可以看出,程序无异常,依次输出try,finally中的文字,并输出try中的返回结果。