异常机制
异常:异常指的是在程序运行过程中发生的异常事件,通常是由外部问题(如硬件错误、输入错误)所导致的。在Java等面向对象的编程语言中异常属于对象。
早期的C语言的异常处理机制,通常是我们人为的对返回结果加一些标志来进行判定,比如发生错误返回什么标志,正常情况下我们又是返回什么标记,而这些都不是语言本身所赋予我们的,这种机制的问题在于,C语言的异常处理机制全是我们人为的定义,这样就会造成业务逻辑的主线受到异常处理的牵制,或者说是我们难免会将注意力转移,并且造成业务逻辑与异常处理之间有很大程度上的缠绕。
当然,再程序中异常还是和错误有区别的
- 异常(Exception)都是运行时的。编译时产生的不是异常,而是错误(Error)
- 最开始大家都将程序设计导致的错误(Error)认定文不属于异常(Exception)
- 但是一般都将Error作为异常的一种,所以异常一般分两类,Error与Except
Java中的异常
定义
异常都是从类Throwable类派生出来的,而Throwable类是直接从Object类继承而来,可见Java对异常处理的重视程度。
Exception 异常
Error:系统内部错误,这类错误由系统进行处理,程序本身无需捕获处理;
RuntimeException:可以捕获,也可以不捕获的异常。
try { }catch(处理异常)语句块 捕捉异常
try {
可能产生异常的代码
}catch(Typel id1){
处理Typel异常的代码
}catch(Typel id2){
处理Typel异常的代码
}catch(Typel id3) {
处理Typel异常的代码
}
在程序中的异常处理
具体用程序代码来实现:捕捉异常
数组下标越界,用异常机制来捕捉并处理
public class ArrayIndex {
public static void f() {
int[] a = new int[10];
a[10] = 10;
System.out.println("hello");
}
public static void main(String[] args) {
int[] a = new int[10];
int idx;
Scanner in = new Scanner(System.in);
idx = in.nextInt();
//捕捉异常
try {
a[idx] = 10;
System.out.println("hello");
}catch(ArrayIndexOutOfBoundsException e)
{
System.out.println("Caught");
}
}
}
如果再程序调用中,则作少许改变
import java.util.Scanner;
public class ArrayIndex {
public static void f() {
int[] a = new int[10];
a[10] = 10;
System.out.println("hello");
}
public static void g() {
f();
}
public static void h() {
int i=10;
if(i<100) {
g();
}
}
public static void k() {
try {
h();
}catch(ArrayIndexOutOfBoundsException e) {
System.out.println("k()");
throw e;
}
}
public static void main(String[] args) {
try {
k();
}catch(ArrayIndexOutOfBoundsException e) {
System.out.println("caught");
System.out.println(e.getMessage());//获得异常的主要对象信息
System.out.println(e);
e.printStackTrace(); //获得异常中间的路径
}
System.out.println("main");
}
}
分析
拿到异常对象后:
- String getMessage();
- String toString();
- void printStackTrace();
但是肯定是回不去了,而具体的处理逻辑规则取决于你的业务逻辑
于是,再度抛出
catch(Exception e){
System.out.println("An exception was thrown");
throw e;
}
如果在这个层面上需要处理,但是不能做最终决定