程序运行时发生了不被期望的事件,阻止了程序按照预期正常执行。
Java.lang
软件包中有一个java.long.Throwable
类,这个类是java中所有错误和异常的超类,Throwable
类有两个子类,Error
和Exception
。
Error,是Throwable
的子类,包含大量子类,出错后程序无法处理,如OutOfMemeryError
;
Exception,是Throwable
的子类,包含大量子类,程序本身可以处理的异常,如ArraryIndexOutOfBoundException
。Exception又分成两类:运行时异常,也叫不可查异常(RuntimeException)和非运行时异常也叫可查异常(IOException)。
java内置异常
可查异常(必须在方法里面捕获或者抛出)
ClassNoFoundException
应用程序试图加载类,却找不到对应的类;IllegalAccessExcetion
拒绝访问一个类的时候;NoSuchFieldExcetion
请求变量不存在;NoSuchMethodException
方法不存在;
不可查异常
ArrayIndexOutOfBoundsException
数据索引越界;ClassCastException
强制失败抛出异常;NullPointerException
需要对象的地方使用null
时,抛出该异常;NumberFormatException
将字符串换成一种数值类型,但该字符串不能转换为适当的格式时,抛出该异常;
Throwable类核心方法
public String getMessage()
获取异常的详细信息;public Throwable getCause()
获取异常原因;public void printStackTrace()
打印错误的堆栈信息,即错误输出流,可以看到错误原因和所在位置;public StackTraceElement [] getStackTrace()
对账层次的数据,下标为0的元素代表栈顶,最后一个元素代表方法调用堆栈的栈底;
try…catch…finally
try {
// 可能产生异常的语句
语句;
} catch (异常类1 异常对象1) {
// 处理异常
} catch (异常类2 异常对象2) {
// 处理异常
} finally {
// 无论是否发生异常都会执行的语句
}
示例
import java.util.InputMismatchException;
import java.util.Scanner;
public class ExceptionTest {
public static void main(String[] args) {
System.out.println("1 注册");
System.out.println("2 登录");
int[] choice = {1, 2};
System.out.println("请输入序号");
Scanner scanner = new Scanner(System.in);
try {
int num = scanner.nextInt();
if (num == choice[2])
System.out.println("欢迎光临");
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("数组越界了");
} catch (InputMismatchException e) {
System.out.println("输入的不是数字");
} catch (Exception e){
System.out.println("程序发生异常");
e.printStackTrace();
} finally {
System.out.println("程序运行结束,释放资源!");
}
}
}
throws-thorw
throws
声明方法可能抛出的异常
修饰符 返回值类型 方法名(参数) throws 异常类1, 异常类2,...{
方法体
}
进行了throws声明表示该方法不进行异常处理,由该方法的调用者负责处理异常。
public class ThrowsDemo {
public static void main(String[] args) {
try {
test(10, 0);
} catch (ArithmeticException e) {
System.out.println("除数不能为0");
}
}
public static void test(int a, int b) throws ArithmeticException {
double result = a/b;
System.out.println("result" + result);
}
}
thorw
在方法中直接抛出异常
{
throw new 异常类名();
}
public class ThrowsDemo {
public static void main(String[] args) {
test2(10, 0);
}
public static void test2(int a, int b){
if(b == 0) {
throw new ArithmeticException("除法运算中,除数不能为0");
}
double result = a/b;
System.out.println("result:" + result);
}
}