JAVA_FIFTEEN_异常
目录
一、认识异常
什么是异常?
异常的体系
如何应对异常
二、自定义异常
RuntimeException 运行时异常
Exception 编译时异常
三、异常的处理
捕获异常,记录异常并响应合适的信息返回给用户
捕获异常,尝试修复
一、认识异常
什么是异常?
异常就是代表程序出现的问题
异常的体系
上图展示了Java异常的基本体系结构:
- 所有异常都源自Throwable类
- Throwable分为Error和Exception两大类
- Exception又分为RuntimeException(运行时异常)(如数组索引越界异常)和CheckedException(检查型异常又称为编译时异常)(日期解析时异常)
- 图中还列举了一些常见的具体异常类型
如何应对异常
在Java中,有几种主要的方法来应对异常:
- try-catch 块:用于捕获和处理可能发生的异常。
- throws 关键字:用于声明方法可能抛出的异常,将异常处理的责任传递给调用者。
- throw 关键字:用于手动抛出异常。
- inally 块:用于指定无论是否发生异常都要执行的代码。
- try-with-resources 语句:用于自动关闭实现了 AutoCloseable 接口的资源。
二、自定义异常
RuntimeException 运行时异常
定义:继承自RuntimeException
的异常(如NullPointerException
、ArrayIndexOutOfBoundsException
),属于非受检异常。
发生时机:代码运行时才会出现(编译阶段不检查)。
常见场景:通常是代码逻辑错误导致的,
比如:
- 访问
null
对象的方法(NullPointerException
) - 数组下标越界(
ArrayIndexOutOfBoundsException
) - 类型转换错误(
ClassCastException
) - 除以 0(
ArithmeticException
)
Exception 编译时异常
定义:除了RuntimeException
及其子类之外的Exception
(如IOException
、SQLException
),属于受检异常。
发生时机:编译阶段就会被检查,编译器强制要求处理,否则代码无法通过编译。
使用场景:通常是外部环境导致的可预见异常
比如
- 文件读写错误(
IOException
) - 数据库连接失败(
SQLException
) - 日期格式解析错误(
ParseException
)
举例:
运行时异常和编辑时异常代码
public class Exception_Test1 {public static void main(String[] args) {//需求:保存一个合法的年龄try {savaAge(111);System.out.println("savaAge执行成功");} catch (Exception e) {e.printStackTrace(); //将错误信息打印到控制台System.out.println("savaAge出现错误");}try {savaAge2(133);System.out.println("savaAge2执行成功");} catch (AgeIllegalException e) {e.printStackTrace();System.out.println("savaAge2出现错误");}}//自定义运行时异常public static void savaAge(int age) {if (age > 0 && age < 150) {System.out.println("年龄保存成功" + age);} else {//throw 抛出去这个异常throw new AgeIllegalRuntimeException("/age is illegal your age is " + age);}}//自定义编辑时异常public static void savaAge2(int age) throws AgeIllegalException {if (age > 0 && age < 150) {System.out.println("年龄保存成功" + age);} else {//throw 抛出去这个异常throw new AgeIllegalException("/age is illegal your age is " + age);}}
}
作用:
1、异常用来检查系统是否出现Bug的关键信息
2、异常作为方法内部的一种特殊返回值,以便通知上层调用者底层的执行情况
三、异常的处理
捕获异常,记录异常并响应合适的信息返回给用户
-
捕获异常,记录异常并响应合适的信息返回给用户
public class Exception_Test2 {public static void main(String[] args) {try {test1();} catch (ParseException e) {System.out.println("你要解析的时间失败了!");e.printStackTrace();} catch (FileNotFoundException e) {System.out.println("你要解析的文件不存在!");e.printStackTrace();}}public static void test1() throws ParseException, FileNotFoundException {SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");Date localDate=sdf.parse("2112-12-13 11-10-32");System.out.println(localDate);test2();}public static void test2() throws FileNotFoundException {InputStream is=new FileInputStream("D:/abc.png");} }
捕获异常,尝试修复
-
捕获异常,尝试修复
public class ExceptionTest3 {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 sc=new Scanner(System.in);while (true) {System.out.println("请输入合适的价格:");double money=sc.nextDouble();if(money>0 && money<100){return money;}else {System.out.println("输入的价格不合适!");}}} }