认识异常
异常就是程序出现的问题;
Integer.valueOf("aaaa");
异常体系
因为写代码时经常会出现问题,Java的设计者们早就为我们写好了很多个异常类,来描述不同场景下的问题。而有些类是有共性的所以就有了异常的继承体系
Error:代表的系统级别错误(属于严重问题),也就是说系统一旦出现问题,sun公司会把这些问题封装成Error对象给出来,说白了,Error是给sun公司自己用的,不是给我们程序员用的,因此我们开发人员不用管它
Exception:叫异常,它代表的才是我们程序可能出现的问题,所以,我们程序员通常会用Exception以及它的子类来封装程序出现的问题
运行时异常:RuntimeException及其子类,编译阶段不会出现错误提醒,运行时出现的异常(如:数组索引越界异常)(非受检)
int[] arr = {1,2,3,4,5};
Sysout.out.println(arr[5]);
产生ArrayIndexOutOfBoundsExcpetion异常
编译时异常:编译阶段就会出现错误提醒的(如:日期解析异常)(受检)
自定义异常
如果企业自己的某种问题,想通过异常来表示,那就需要自己来定义异常类了。
应用:
public class Test01 {public static void main(String[] args) {}public static void saveAge(int age) throws AgeOutOfBroundException {if(age > 0 && age < 150 ){info("年龄保存成功");}else {throw new AgeOutOfBroundException("年龄超出范围");}}
}
class AgeOutOfBroundException extends Exception{public AgeOutOfBroundException() {}public AgeOutOfBroundException(String 年龄超出范围) {}
}
注意咯,自定义异常可能是编译时异常,也可以是运行时异常
1.如果自定义异常类继承Excpetion,则是编译时异常。
特点:方法中抛出的是编译时异常,必须在方法上使用throws声明,强制调用者处理。
2.如果自定义异常类继承RuntimeException,则运行时异常。
特点:方法中抛出的是运行时异常,不需要在方法上用throws声明。
异常处理
比如有如下的场景:A调用用B,B调用C;C中有异常产生抛给B,B中有异常产生又抛给A;异常到了A这里就不建议再抛出了,因为最终抛出被JVM处理程序就会异常终止,并且给用户看异常信息,用户也看不懂,体验很不好。
此时比较好的做法就是:1.将异常捕获,将比较友好的信息显示给用户看;2.尝试重新执行,看是是否能修复这个问题。
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;public class Test02 {public static void main(String[] args) {try {test1();} catch (ParseException e) {System.out.println("你想要找的文件不存在");;} catch (FileNotFoundException e) {System.out.println("你要解析的时间不正确");throw new RuntimeException(e);}}public static void test1() throws ParseException, FileNotFoundException {SimpleDateFormat dateFormat = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");Date date = dateFormat.parse("2028-02-28 22:18:46");System.out.println(date);test2();}private static void test2() throws FileNotFoundException {InputStream inputStream = new FileInputStream("D:/movie.pang");}
}
第一种处理方式是,在main方法中对异常进行try...catch捕获处理了,给出友好提示。
第二种处理方式是:在main方法中对异常进行捕获,并尝试修复
import java.util.Scanner;
/*** 目标:掌握异常的处理方式:捕获异常,尝试修复。*/
public class Test03 {public static void main(String[] args) {while (true){try {System.out.println(getmoney());break;} catch (Exception e) {System.out.println("你输入有误");//打印错误信息}}}public static double getmoney(){Scanner scanner = new Scanner(System.in);while (true){System.out.println("请输入你的钱数");double money = scanner.nextDouble();if(money > 0){return money;}else {System.out.println("你输入的价格不合适");}}}
}