【详细+超基础】Java-学习笔记 12

简介: 【详细+超基础】Java-学习笔记 12

7fae36d1e520c133b402b12f7f2ff1e.png

八、异常


异常:


指的是程序在执行过程中,出现的非正常的情况,最终导致JVM的非正常停止,在Java中,异常本身是一个类,产生异常就是创建异常对象并抛出一个异常对象,Java处理异常的方式是中断处理。


异常的基本语法


1.处理异常的语法:

 try{
     // 可能出现异常的代码
 } catch(参数:异常的类型 e) {
     // 捕获try当中可能出现的异常
 } finally {
     // 异常的出口(必然会执行的语句)
 }

总结:


0.在 catch 块中,一定要捕获相对应的异常,如果程序抛出的异常在catch 块当中,不能被捕获,那么就会交给 JVM 处理。


1.可以通过catch 捕获多个异常。 例如:

     public static void main(String []args) {
         try{
             int [] array = {1,2,3};
             System.out.println(array[3]); 
         }catch(NullPointerException e) {
             e.printStackTrace();
             System.out.println("捕获了空指针异常")
         } catch(ArrayIndexOutOfBoundsException e) {
             e.printStackTrace();
             System.out.println("捕获了数组越界异常")
         }
     }

2.不建议直接捕获一个 Exception 的异常


3.可以用 | 同时处理两个异常。 例如:catch( NullPointerException |ArrayIndexOutOfBoundsException ){ }


4.finally 的特性:不管这个代码是否抛出异常,finally 的内容都会被执行。所以 finally 经常来做一些善后的内容。比如:关闭资源


5.catch和finally根据情况选择加与不加


2.异常处理流程


程序先执行try中的代码

如果try中的代码出现异常,就会结束try中的代码,看和catch中的异常类型是否匹配.

如果找到匹配的异常类型,就会执行catch中的代码

如果没有找到匹配的异常类型,就会将异常向上传递到上层调用者.

无论是否找到匹配的异常类型, finally 中的代码都会被执行到(在该方法结束之前执行)

如果上层调用者也没有处理的了异常,就继续向上传递.

一直到main方法也没有合适的代码处理异常,就会交给jVM来进行处理,此时程序就会异常终止…


3.抛出异常


除了 Java 内置的类会抛出一些异常之外, 我们可以手动抛出某个异常. 使用 throw 关键字完成这个操作。

throw 一般抛出一个你想要抛出的异常(或者自定义的异常)

(1)throw的使用

 public static int devide (int x,int y) {
     if(y==0) {
         throw new ArithmeticException("y==0");
     }
     return x/y;
 } 
 public static void main(String []args) {
     devide (10,0);
 }
 //  我们用 throw new 了一个算数异常,因为算数异常本身也是一个类,所以需要实例化。
 结果:
     Exception in thread "main" java.lang.ArithmeticException: y==0
         at exception.demo.devide(demo.java:6)
         at exception.demo.main(demo.java:11)   
 //  成功的抛出异常了,但是这样写有一个不好的地方。我们抛出了一个异常但是呢,这个异常我们只是抛出了但是并未处理,所以最后程序出现异常后交给JVM处理,程序最后终止。    

(2)异常的声明

对于上例,如果 devide 方法的内容很多,我们就看不出 devide 会抛出一个异常。那么为了让调用devide 方法的人知道,我们调用这个方法会抛出这个异常,一般情况下,我们会给这个方法进行声明异常。


声明异常:我们在处理异常的时候,通常希望知道这段代码中究竟会出现哪些可能的异常,我们可以使用throws关键字,把可能抛出的异常名字标注在方法定义的位置,从而提醒调用者注意捕获这些异常.


 // 通过throws 声明这个方法会抛出一个异常
 public static int devide (int x,int y)throws ArithmeticException{
     if (y==0) {
         throw new ArithmeticException("y==0");
     }
     return x/y;
 }
 public static void main(String []args) {
     try {
         devide(10,0);
     }catch(ArithmeticExcetion e) {
         e.printStackTrace();
         System.out.println("捕获了算数异常");
     }finally{
         System.out.println("这是finally代码块的语句一定会被执行");
     }
 }
 // 方法调用者知道了调用该方法可能会抛出算数异常,就用上了 try…catch 来捕获异常。
 结果:
     java.lang.ArithmeticException: y==0
     捕获了算数异常
     这是finally代码块的语句一定会被执行
     at exception.demo.devide(demo.java:6)
     at exception.demo.main(demo.java:12)

Java异常体系


A: 异常的继承体系 Throwable: 它是所有错误与异常的超类(祖宗类) |- Error 错误 |- Exception 编译期异常,进行编译JAVA程序时出现的问题 |- RuntimeException 运行期异常, JAVA程序运行过程中出现的问题


B:异常与错误的区别

 a:异常
 * 指程序在编译、运行期间发生了某种异常(XxxException),我们可以对异常进行具体的处理。
 * 若不处理异常,程序将会结束运行。
 * 案例:
   public static void main(String[] args) {
     int[] arr = new int[3];
     System.out.println(arr[0]);
     System.out.println(arr[3]);
     // 该句运行时发生了数组索引越界异常ArrayIndexOutOfBoundsException,由于没有处理异常,导致程       序无法继续执行,程序结束。
     System.out.println("over"); // 由于上面代码发生了异常,此句代码不会执行
   }
 b:错误
    * 指程序在运行期间发生了某种错误(XxxError),Error错误通常没有具体的处理方式,程序将会结束运行。
    * Error错误的发生往往都是系统级别的问题,都是jvm所在系统发生的,并反馈给jvm的。
    * 我们无法针对处理,只能修正代码。
    * 案例演示:
      public static void main(String[] args) {
         int[] arr = new int[1024*1024*100];
         //该句运行时发生了内存溢出错误OutOfMemoryError,开辟了过大的数组空间,
         //导致JVM在分配数组空间时超出了JVM内存空间,直接发生错误。
      }

自定义异常


Java 中虽然已经内置了丰富的异常类, 但是我们实际场景中可能还有一些情况需要我们对异常类进行扩展, 创建符合自己实际情况的异常.


我们来实现一个简单的自定义的异常类


首先 我们要自定义一个异常类 同时继承一个父类异常


 class MyException extends Exception {
     public MyException() {
         super();
     }
     public MyException(String message) {
         super(message); 
     }
 }

案例:

 class MyException extends Exception {
     public MyException() {
         super();
     }
     public MyException(String message) {
         super(message); 
     }
 }
 public static void test(int x)throws MyException{
     if (x==1) {
         throw new MyException("抛出自定义异常");
     }
 }
 public static void main (String []args) {
     try {
         test(1);
     }catch (MyException e){
         e.printStackTrace();
         System.out.println("捕获了自定义异常")
     }
 }
 结果:
     exception.MyExcetion: 抛出自定义异常
         捕获了自定义异常
         at exception.demo.test(demo.java:6)
         at exception.demo.main(demo.java:11)
 // 这就是我们自定义异常的使用。


相关文章
|
7月前
|
Java API 微服务
2025 年 Java 从入门到精通学习笔记全新版
《Java学习笔记:从入门到精通(2025更新版)》是一本全面覆盖Java开发核心技能的指南,适合零基础到高级开发者。内容包括Java基础(如开发环境配置、核心语法增强)、面向对象编程(密封类、接口增强)、进阶技术(虚拟线程、结构化并发、向量API)、实用类库与框架(HTTP客户端、Spring Boot)、微服务与云原生(容器化、Kubernetes)、响应式编程(Reactor、WebFlux)、函数式编程(Stream API)、测试技术(JUnit 5、Mockito)、数据持久化(JPA、R2DBC)以及实战项目(Todo应用)。
404 5
|
10月前
|
存储 Java
# 【Java全栈学习笔记-U1-day02】变量+数据类型+运算符
本篇笔记主要围绕Java全栈学习的第二天内容展开,涵盖了变量、数据类型、运算符以及Scanner类的应用。首先介绍了变量的概念与命名规范,以及如何定义和使用变量;接着详细讲解了Java中的基本数据类型,包括整型、浮点型、字符型、布尔型等,并通过实例演示了数据类型的运用。随后,深入探讨了各类运算符(赋值、算术、关系、逻辑)及其优先级,帮助理解表达式的构成。最后,介绍了如何利用Scanner类实现用户输入功能,并通过多个综合示例(如计算圆面积、购物打折、变量交换及银行利息计算)巩固所学知识。完成相关作业将进一步加深对这些基础概念的理解与实践能力。
202 13
|
4月前
|
小程序 Java 知识图谱
Java 学习笔记 —— BMI & BMR 计算器
这是一个使用 Java 编写的 BMI 与 BMR 计算器小程序,可输入年龄、性别、身高和体重,计算身体质量指数(BMI)和基础代谢率(BMR),并输出健康评估结果。通过该项目,掌握了 Java 的输入处理、数据验证、条件判断、数学运算及格式化输出等基础知识,是 Java 初学者的理想练习项目。
|
4月前
|
Java
Java 数组学习笔记
本文整理Java数组常用操作:遍历、求和、查找、最值及二维数组行求和等典型练习,涵盖静态初始化、元素翻倍、去极值求平均等实例,帮助掌握数组基础与应用。
|
10月前
|
开发框架 Java 开发工具
【Java全栈学习笔记-U1-day01】Java介绍
本笔记整理了Java学习的基础内容,涵盖程序理解、Java语言特性、JDK安装与配置、Java程序开发工具及编写步骤。重点介绍了Java程序的基本结构、编译和运行过程,以及输出语句的使用。通过实例演示了IDEA创建Java程序的方法,并强调了编码规范和注意事项。适合初学者复习和交流学习。 主要内容: 1. 理解程序:计算机组成、程序定义。 2. 简介:Java语言特点、技术平台、JDK作用。 3. 编写Java程序:编写、编译、运行步骤,基本结构。 4. 输出语句 5. DEA使用:新建工程、保存位置、文件介绍、新建类。 6. 扩展:注释、代码规范、大小写敏感、缩进等。
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
407 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
|
存储 安全 Java
Java修仙之路,十万字吐血整理全网最完整Java学习笔记(高级篇)
本文是“Java学习路线”中Java基础知识的高级篇,主要对多线程和反射进行了深入浅出的介绍,在多线程部分,详细介绍了线程的概念、生命周期、多线程的线程安全、线程通信、线程同步,并对synchronized和Lock锁;反射部分对反射的特性、功能、优缺点、适用场景等进行了介绍。
Java修仙之路,十万字吐血整理全网最完整Java学习笔记(高级篇)
|
Java 数据库连接 API
Spring 框架的介绍(Java EE 学习笔记02)
Spring是一个由Rod Johnson开发的轻量级Java SE/EE一站式开源框架,旨在解决Java EE应用中的多种问题。它采用非侵入式设计,通过IoC和AOP技术简化了Java应用的开发流程,降低了组件间的耦合度,支持事务管理和多种框架的无缝集成,极大提升了开发效率和代码质量。Spring 5引入了响应式编程等新特性,进一步增强了框架的功能性和灵活性。
265 0
|
Java 数据安全/隐私保护
java学习笔记(基础习题)
java学习笔记(基础习题)
171 0