目录
异常
概述:异常就是程序出现了不正常的情况
异常体系:
Throwable是所有异常的超类
JVM的默认处理异常方式
如果代码出现异常,而我们没有做任何处理,那么JVM会做默认的处理方式,处理方式分以下两个步骤
1.把异常的名称,错误原因及异常出现的位置等信息输出在控制台上
2.程序从异常处停止执行
try-catch方式处理异常
定义格式:
try {
可能出现异常的代码;
} catch(异常类名 变量名) {
异常的处理代码;
}
执行流程:
程序从try里的代码开始执行,
出现异常,就会跳转到catch里去执行
执行完毕之后,代码还可以继续运行下去
示例代码:
public class Demo {
public static void main(String[] args) {
//调用方法
System.out.println("开始");
method();
System.out.println("结束");
//虽然和默认处理一样报错,但是程序还是会继续往下运行
}
// public static void method(){
// //创建一个数组
// int arr[] = {1,2,3};
// //访问数组
// System.out.println(arr[3]);//这时控制台出现报错:ArrayIndexOutOfBoundsException
// //注释掉,重新来
// }
public static void method(){
try{
//继续上一段,但是这次放到try中
int arr [] = {1,2,3};
System.out.println(arr[3]);
//把异常类名放到catch中
}catch (ArrayIndexOutOfBoundsException e){
//这里相当于创建了异常类的对象e,调方法显示异常的类名原因和位置
e.printStackTrace();
}
}
}
Throwable成员方法
常用方法:
方法名 | 说明 |
---|---|
public String getMessage() | 返回此 throwable 的详细消息字符串 |
public String toString() | 返回此可抛出的简短描述 |
public void printStackTrace() | 把异常的错误信息输出在控制台 |
getMessage()会返回异常的原因
toString()返回异常的类名以及原因
printStackTrace()会返回异常的类名,原因,还有位置。所以我们通常都用printStackTrace()
编译时异常和运行时异常的区别
编译时异常:
都是Exception类及其子类
必须显示处理,否则程序就会发生错误,无法通过编译
运行时异常:
都是RuntimeException类及其子类
无需显示处理,也可以和编译时异常一样处理
(编译时异常是有可能出现异常,但是不一定出现,但是就必须处理异常,不然无法运行)
(运行时异常可以不处理就通过编译,但是运行时会报错,也可以像编译时异常那样处理)
throws方式处理异常
定义格式:
public void 方法() throws 异常类名 {
}
示例代码:
public class ExceptionDemo {
public static void main(String[] args) {
System.out.println("开始");
// method();
try {
method2();
}catch (ParseException e) {
e.printStackTrace();
}
System.out.println("结束");
}
//编译时异常
public static void method2() throws ParseException {
String s = "2048-08-09";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date d = sdf.parse(s);
System.out.println(d);
}
//运行时异常
public static void method() throws ArrayIndexOutOfBoundsException {
int[] arr = {1, 2, 3};
System.out.println(arr[3]);
}
}
注意事项:
-
这个throws格式是跟在方法的括号后面的
-
编译时异常必须要进行处理,两种处理方案:try...catch …或者 throws,如果采用 throws 这种方案,将来谁调用谁处理(throws只是抛出了异常,将会由调用者来处理)
-
运行时异常可以不处理,出现问题后,需要我们回来修改代码
throws和throw的区别
自定义异常
自定义异常,自己创建一个类,并继承Exception就可以说它是异常类,在程序中自己定义当出现某种状况时就会触发异常,然后解决异常,并在控制台输出自定义的异常原因
示例:键盘录入输入几个数字,并计算数字的和还有平均值,当输入为负数时触发异常,并提示“只能输入正数或0”然后重新输入数字
public static void main(String[] args) throws abc {
//提示用户输入
System.out.println("要计算几个整数的平均值");
Scanner sc = new Scanner(System.in);
//接收几个数字
int i = sc.nextInt();
//定义变量储存数字的和
int a = 0;
for (int j = 0;j<i;j++){
System.out.println("请输入第"+(j+1)+"个数字");
//循环键盘录入每个数的值
int c = sc.nextInt();
//判断如果为负数则触发异常并处理异常
try {
if (c<0){
throw new abc("必须是正数或0");
}else {
a+=c;
}
}catch (abc e){
e.printStackTrace();
//处理异常时重新输入
j-=1;
}
}
System.out.println("一共"+i+"个数,和为"+a+",平均值为"+a/i);
}
}
//定义异常类
class abc extends Exception{
public abc (){}
public abc (String message){
super(message);
}
}