进阶JAVA篇-异常处理:解读与解决编程中的意外情况

目录

        1.0 什么是异常?

        1.1 异常主要分为两个情况分别是运行时异常、编译时异常。

        2.0 怎么处理异常呢?

        2.1 捕获异常(Catch Exception)

         2.2 声明异常(Declare Exception)

         3.0 自定义异常

        3.1 如何定义异常类?

        3.2 自定义运行异常

        3.3 自定义编译异常

        3.4 区别 throw 与 throws 

        4.0 用例子进一步了解异常的魅力:


        1.0 什么是异常?

        异常是在程序执行过程中出现的意外或不正常的情况。当程序遇到无法处理的错误、意外输入或其他不符合预期的情况时,会引发异常。这可能包括但不限于:除以零、访问不存在的变量、文件读取错误等。异常会打断程序的正常执行流程,并通过抛出异常的方式通知程序员或系统。简单来说就是,就是代表程序出现了问题。

        1.1 异常主要分为两个情况分别是运行时异常、编译时异常。

        运行时异常:指继承自 RuntimeException 的异常类。它们是在程序运行期间可能抛出的异常,通常表示程序中的逻辑错误或错误的使用方式,运行时异常不需要在方法签名中声明或捕获。这意味着你可以选择捕获或不捕获运行时异常,而不会导致编译错误。

常见的运行时异常包括:

  1. NullPointerException(空指针异常):当尝试访问一个空对象的成员时抛出。
  2. IllegalArgumentException(非法参数异常):当传递给方法的参数不合法或无效时抛出。
  3. IllegalStateException(非法状态异常):当对象的状态不符合方法调用的前提条件时抛出。
  4. IndexOutOfBoundsException(索引越界异常):当尝试访问数组或集合中不存在的索引时抛出。
  5. ArithmeticException(算术异常):当出现除以零或其他算术错误时抛出。

运行异常指的是在编译的时候不会去"干扰"程序员,只有在运行的时候出现了类似以上的情况就会报异常。

        举例来说明一下运行异常:

        可以看出来在 IDEA 这个编译器中在编译代码的过程中,并没有很强烈的提示哪里出现了异常。

运行结果如下:

        明确表示了是运行异常。

 

         编译异常:指在编译阶段可能发生的异常,需要在代码中显式地处理或声明。它们是指继承自 Exception(但不是 RuntimeException )的异常类。与运行时异常不同,编译时异常必须在方法签名中声明,或者在方法内部进行捕获和处理,否则会导致编译错误。

常见的编译时异常包括:

  1. IOException(输入输出异常):当发生输入或输出错误时抛出,如文件读取错误、网络连接错误等。
  2. SQLException(SQL异常):当执行SQL操作时发生错误时抛出,如数据库连接错误、SQL语法错误等。
  3. ClassNotFoundException(类未找到异常):当尝试加载不存在的类时抛出。
  4. InterruptedException(中断异常):当线程在等待、休眠或阻塞状态时被中断时抛出。
  5. FileNotFoundException(文件未找到异常):当尝试访问不存在的文件时抛出。

 编译异常指的是在编写代码的时候就出现了异常,要求程序员必须要对这个代码进行处理,这个异常才会被解决。

        举例来说明一下编译异常:

        关注两个点,第一点就是在编写代码的时候 IDEA 编译器就出现了很强烈的提醒,表明了波浪线,是为了提醒程序员这个点很容易出错。第二点,如果对编译异常不采取任何的声明或者捕获的方式时,就会程序会直接报错了,程序运行不了了。

具体的处理异常的方式以下内容会讲到。

        2.0 怎么处理异常呢?

        处理异常的方式可以分为两种:捕获异常和声明异常。

        2.1 捕获异常(Catch Exception

捕获异常(Catch Exception):使用 try-catch 语句块来捕获异常并处理异常情况。try 块中包含可能抛出异常的代码,catch 块用于捕获并处理异常。捕获异常可以防止程序因异常而终止,并提供了对异常情况的处理机制。

import java.text.ParseException;
import java.util.Date;
import java.text.SimpleDateFormat;public class CompilationException {public static void main(String[] args) {Date date = null;try {SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String str = "2028-12-1 12:00:00";date = simpleDateFormat.parse(str);} catch (ParseException e) {throw new RuntimeException(e);}System.out.println(date);}
}

对编译异常采取了捕获异常的方式进行处理。补充一下,在大部分情况中,普通的运行异常没有必要采取捕获异常或者是声明异常处理。但是对于自定义的运行异常很有必要采取相应发措施对异常处理。

 

         2.2 声明异常(Declare Exception

 声明异常(Declare Exception)是在方法签名中声明可能抛出的异常类型。通过在方法声明中使用 throws 关键字列出可能抛出的异常,将异常的责任转移到调用方。调用方必须处理或继续声明这些异常,否则会导致编译错误。

import java.text.ParseException;
import java.util.Date;
import java.text.SimpleDateFormat;public class CompilationException {public static void main(String[] args) throws ParseException {SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String str = "2028-12-1 12:00:00";Date date =  simpleDateFormat.parse(str);System.out.println(date);}
}

对编译异常采取了声明异常的方式进行处理。用了 throws 关键字。

         3.0 自定义异常

        自定义异常是指根据特定的需求和场景,自行定义的异常类。通过自定义异常,可以提供更具体和可读性的异常信息,以便于开发人员在程序出现错误时能够更好地理解和调试问题。简单的来说就是 Java 无法为世界上的所有问题都提供异常类来代表,如果企业自己的某种问题,相通过异常来表示,那就需要自己来定义异常类了。

        3.1 如何定义异常类?

        因为有两种类型的异常,所以方式会稍微不同,但是情况大部分都是一样的。

        3.2 自定义运行异常

        先定义一个类继承 RuntimeException ,然后重写有参数的构造器,最后通过 new 自定义的类并且在构造器中传入需要报错的信息,再通过关键字 throw 抛出这个对象。

代码如下:

public class AgeAbnormalities extends RuntimeException{public AgeAbnormalities(String message) {super(message);}
}
public class RunException {public static void main(String[] args) {fun(300);}public static void fun(int age){if (age>0 && age < 200){System.out.println(age);}else {System.out.println("输入不合法");throw  new AgeAbnormalities("The age you entered is not legal");}}
}

运行结果如下:

 

        3.3 自定义编译异常

        先定义一个异常类继承 Exception ,任何重写有参数的构造器,通过 throw new 异常类() 来创建异常对象并抛出。

代码如下:

public class AgeCompilationException extends Exception{public AgeCompilationException(String message) {super(message);}
}
public class CompilationException {public static void main(String[] args) throws Exception{fun(300);}public static void fun(int age) throws Exception{if (age > 0 && age < 200){System.out.println(age);}else {throw new AgeCompilationException("The age you entered is not legal");}}
}

需要注意的是:对于自定义编译异常,在编写完 throw new AgeCompilationException("The age you entered is not legal");  这条语句之后,需要通过 throws 关键字声明异常,接着调用这个函数也需要用到声明异常或者捕获异常对编译异常处理。

运行结果如下:

 

        3.4 区别 throwthrows 

        throw throws 是 Java 中用于处理异常的关键字。

        throw 关键字用于抛出一个异常对象。它通常用于方法内部,用于在特定的条件下主动抛出异常。使用 throw 关键字时,需要提供一个异常对象作为参数,该异常对象可以是 Java 内置的异常类,也可以是自定义的异常类。

        throws 关键字用于在方法声明中指定可能抛出的异常类型。它用于告诉调用者,该方法可能会抛出某些异常,调用者需要进行相应的异常处理。使用 throws 关键字时,需要在方法声明后面跟上异常类型,可以是一个或多个异常类型,多个异常类型之间使用逗号分隔。

 

        4.0 用例子进一步了解异常的魅力:

import java.util.Scanner;
public class Text_Exception {public static void main(String[] args) {while (true) {try {getMoney();break;} catch (Exception e) {System.out.println("请输入数字!!!");}}}public static void getMoney(){Scanner scanner = new Scanner(System.in);while (true) {System.out.println("请输入价格:");double money = scanner.nextDouble();if (money > 0){System.out.println(money);break;}else {System.out.println("输入不合法,请重新输入!!!");}}}
}

运行结果如下:

         具体作用就算非法输入不是数字时,程序都不会崩,而是尝试重新修复。所以这个程序非常健壮!自己去感受感受遇到这种情况的时候,是否可以用异常来解决。

 这里有更多内容:小扳_-CSDN博客



 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/140251.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第60节——使用redux-toolkit实战一个商品列表的增删查改

一、样例 二、需求 调用goods.js这个单例完成对goods数据的增删查改 class Goods {constructor() {const data localStorage.getItem("qf-goods-data");this.goods data ? JSON.parse(data) : [];}time 500;/*** 获取商品* returns*/getGoods() {return new Pr…

spring6-资源操作:Resources

资源操作&#xff1a;Resources 1、Spring Resources概述2、Resource接口3、Resource的实现类3.1、UrlResource访问网络资源3.2、ClassPathResource 访问类路径下资源3.3、FileSystemResource 访问文件系统资源3.4、ServletContextResource3.5、InputStreamResource3.6、ByteAr…

联合体(共用体)

1. 联合类型的定义 联合也是一种特殊的自定义类型。 这种类型定义的变量也包含一系列的成员&#xff0c;特征是这些成员公用同一块空间。 2.联合大小的计算 联合的大小 至少是最大成员的大小 。 当最大成员大小不是最大对齐数的整数倍的时候&#xff0c;就要对 齐到最大对齐数…

【AI视野·今日CV 计算机视觉论文速览 第268期】Mon, 16 Oct 2023

AI视野今日CS.CV 计算机视觉论文速览 Mon, 16 Oct 2023 Totally 61 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computer Vision Papers Vision-by-Language for Training-Free Compositional Image Retrieval Authors Shyamgopal Karthik, Karsten Roth, Massi…

C#中List、Dictionary、HashSet用法以及区别

前言 在C#编程中&#xff0c;List、Dictionary和HashSet是常用的集合类型,它们都有自己的特点和适用场景。本篇博客将介绍它们的用法、区别及常见操作。深入了解这些集合类型&#xff0c;能够帮助我们更好地组织和处理数据。 1. List: List是一个有序可重复集合&#xff0c;可…

SpringBoot实战(二十五)集成 Shiro

目录 一、Shiro 简介1.1 Shiro 定义1.2 Shiro 核心组件1.3 Shiro 认证过程 二、SpringBoot集成2.1 集成思路2.2 Maven依赖2.3 自定义 Realm2.4 Shiro 配置类2.5 静态资源映射2.6 AuthController2.7 User 实体2.8 用户接口类2.9 用户接口实现类2.10 OrderController&#xff08;…

stable diffusion和midjourney哪个好

midjourney和stable diffusion哪个好&#xff1f;midjourney和stable diffusion的区别&#xff1f;那么今天就从这2款软件入手&#xff0c;来探索一下他们的功能的各项区别吧&#xff0c;让你选择更适合你的一款ai软件。 截至目前&#xff0c;我们目睹了生成式人工智能工具的在…

CUDA编程入门系列(二) GPU硬件架构综述

一、Fermi GPU Fermi GPU如下图所示&#xff0c;由16个SM&#xff08;stream multiprocessor&#xff09;组成&#xff0c;不同的SM之间通过L2 Cache和全局内存进行相连。整个架构大致分为两个层次&#xff0c;①总体架构由多个SM组成 ②每个SM由多个SP core&#xff08;stream…

logback服务器日志删除原理分析

查看以下的logback官方文档 Chapter 4: Appendershttps://logback.qos.ch/manual/appenders.html 按文档说明&#xff0c;maxHistory是设置保存归档日志的最大数量&#xff0c;该数量的单位受到fileNamePattern里的值%d控制&#xff0c;如果有多个%d,只能有一个主%d&#xff0…

项目管理与SSM框架(二)| Spring

Spring简介 Spring是一个开源框架&#xff0c;为简化企业级开发而生。它以IOC&#xff08;控制反转&#xff09;和AOP&#xff08;面向切面&#xff09;为思想内核&#xff0c;提供了控制层 SpringMVC、数据层SpringData、服务层事务管理等众多技术&#xff0c;并可以整合众多…

第0章:怎么入手tensorflow

近年来人工智能的火爆吸引了很多人&#xff0c;网上相关的热门课程报名的人很多&#xff0c;但是坚持下去的人却少。那些晦涩的原理没有一定知识的积累很难能理解。 如果你对人工智能感兴趣&#xff0c;且想利用人工智能去实现某项功能&#xff0c;而不是对人工智能本身感兴趣&…