> 技术文档 > JAVA_FIFTEEN_异常

JAVA_FIFTEEN_异常

目录

一、认识异常

什么是异常?

异常的体系

如何应对异常

二、自定义异常

RuntimeException 运行时异常

Exception 编译时异常

三、异常的处理

捕获异常,记录异常并响应合适的信息返回给用户

捕获异常,尝试修复


一、认识异常

什么是异常?

异常就是代表程序出现的问题

异常的体系

上图展示了Java异常的基本体系结构:

  1. 所有异常都源自Throwable类
  2. Throwable分为Error和Exception两大类
  3. Exception又分为RuntimeException(运行时异常)(如数组索引越界异常)和CheckedException(检查型异常又称为编译时异常)(日期解析时异常)
  4. 图中还列举了一些常见的具体异常类型

如何应对异常

在Java中,有几种主要的方法来应对异常:

  1. try-catch 块:用于捕获和处理可能发生的异常。
  2. throws 关键字:用于声明方法可能抛出的异常,将异常处理的责任传递给调用者。
  3. throw 关键字:用于手动抛出异常。
  4. inally 块:用于指定无论是否发生异常都要执行的代码。
  5. try-with-resources 语句:用于自动关闭实现了 AutoCloseable 接口的资源。

二、自定义异常

RuntimeException 运行时异常

定义:继承自RuntimeException的异常(如NullPointerExceptionArrayIndexOutOfBoundsException),属于非受检异常

发生时机:代码运行时才会出现(编译阶段不检查)。

常见场景:通常是代码逻辑错误导致的,

比如:

  • 访问null对象的方法(NullPointerException
  • 数组下标越界(ArrayIndexOutOfBoundsException
  • 类型转换错误(ClassCastException
  • 除以 0(ArithmeticException

Exception 编译时异常

定义:除了RuntimeException及其子类之外的Exception(如IOExceptionSQLException),属于受检异常

发生时机:编译阶段就会被检查,编译器强制要求处理,否则代码无法通过编译

使用场景:通常是外部环境导致的可预见异常

比如

  • 文件读写错误(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(\"输入的价格不合适!\"); } } }}

游戏攻略