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 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(\"输入的价格不合适!\"); } } }}