Java异常和异常处理(主要是try-catch的掌握)

异常

1、异常介绍

(1)基本概念

Java语言中,将程序执行中发生的不正常情况称为“异常”.(开发过程中的语法错误和逻辑错误不是异常)

快捷键: ctrl+alt+t,选中try-catch

执行过程中的异常可以分为两大类:

  1. Error(错误):Java虚拟机无法解决的严重问题。比如:JVM系统内部错误,资源耗尽等严重情况。比如:StackOverFlowErrorOOM(out of memory),Error是严重错误,程序会崩溃。
  2. Exception:其他因为编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。例如空指针访问,试图读取不存在的文件,网络连接中断等等。Exception分为两类:运行时异常和编译时异常
(2)异常体系图

这里画了一些常见经典的异常。

在这里插入图片描述

总结:

  1. 异常分为两大类,运行时异常和编译时异常
  2. 运行时异常,编译器检查不出来,一般是指编程时的逻辑错误,是程序员应该避免其出现的异常。java.lang.RuntimeException类以及它的子类都是运行时异常。
  3. 对于运行时异常,可以不做处理,因为这类异常很普遍,如果全部处理会对程序的可读性和运行效率产生影响。
  4. 编译时异常,是编译器要求必须处置的异常,不然编译不能通过,直接报错。

2、运行时异常

常见的运行时异常(RuntimeError)

  1. NullPointerException 空指针异常
  2. ArithmeticException 数字运算异常
  3. ArrayIndexOutOfBoundsException 数组下标越界异常
  4. ClassCastException 类型转换异常
  5. NumberFormatException 数字格式不正确异常

3、编译时异常

编译异常实在编译期间,就必须处理的异常,否则代码不能通过编译。

常见的编译异常有:

  1. SQLException 操作数据库,查询表可能发生异常
  2. IOException 操作文件时,发生的异常
  3. FileNotFoundException 当操作一个不存在的文件时,发生的异常
  4. EOFException 操作文件,到文件末尾,发生异常
  5. IllegalArguementException参数异常

4、异常处理

异常处理就是当异常发生事,对异常处理的方式

异常处理的方式:

  1. try-catch-finally 程序元在代码中捕获发生的异常,自行处理

    处理机制:

    try{代码/可能有异常
    }catch(Exception e){//捕获异常//1、当异常发生时//2、系统将异常封装成Exception对象e,传递给catch//3、得到异常对象后,程序员,自己处理//4、注意,如果没有发生异常,catch代码块不执行
    }finally{//1、不管try代码块是否有异常发生,始终要执行finally//2、所以,通常将释放资源的代码,放在finally
    }
    
  2. throws 将发生的异常抛出,交给调用者(方法)来处理,最顶级的就是JVM

    处理机制:

    在这里插入图片描述

(1)try-catch方式处理异常注意事项
  1. 如果异常发生了,则异常发生后面的代码不会执行,直接进入到catch

  2. 如果异常没有发生,则会顺序执行try里面的代码块,不会进入到catch

  3. 如果希望不管是否发生异常,都执行某段代码(比如关闭连接,释放资源等)则使用finally

  4. 可以有多个catch,捕获不能的异常(进行不同的业务处理),要求父类异常在后面,子类异常前面(比如:Exception在后,NullPointerException在前,如果发生异常,只会匹配一个catch

    举例:

    public class TryCatchDetail01 {public static void main(String[] args) {//多个异常,可以多个catch,但是要求子类写在前面,父类写在后面try {Person person = new Person();System.out.println(person.getName());   //空指针异常int n1 = 10;int n2 = 0;int res = n1/n2;                    //算术异常} catch (NullPointerException e){System.out.println("空指针异常"+e.getMessage());}catch (ArithmeticException e){System.out.println("算术异常"+e.getMessage());}catch (Exception e) {System.out.println(e.getMessage());} finally {}}
    }class Person{private String name;public Person() {}public String getName() {return name;}
    }
    
  5. 可以进行try-finally配合使用,这种相当于没有捕获异常,程序会直接崩溃。应用场景,执行一段代码,不管是否发生异常,都会执行某个业务逻辑。

    try{//可能发生的语句
    }finally{//必须执行的
    }
    

5、throws处理异常

(1)基本介绍
  1. 如果一个方法(中的执行语句时)可能呢生成某种异常,但是并不能确定如何处理这种异常,则此方法应显示的声明抛出异常,表明该方法不对这些异常进行处理,而是由该方法的调用者进行处理。
  2. 在方法声明中用throws语句可以什么抛出异常的列表,throw后面的异常类型可以是方法中产生的异常类型,也可以是它的父类。

举例:

//    public void f2() throws FileNotFoundException{
//    public void f2() throws FileNotFoundException, NullPointerException, ArithmeticException{public void f2() throws Exception{//抛出异常,让调用f2的调用者进行处理//throws后面可以是当前异常的父类,也可以抛出多个异常FileInputStream fis = new FileInputStream("d://aa.txt");}
}
(2)注意事项和使用细节
  1. 对于编译异常,必须进行处理
  2. 对于运行异常,程序没有运行,默认是throws处理
  3. 子类重写父类的方法是,对于抛出异常的规定:子类重写的方法,所抛出的异常要么和父类抛出的异常一致,要么是父类抛出异常的子类。
  4. throws的过程中,如果有方法try-catch,就相当于处理异常,可以不用throws

举例:

public class ThrowsDetails {public static void main(String[] args) {}public static void f1(){//运行时异常,会默认throwsf2();}public static void f2() throws NullPointerException{  }public static void f3() throws Exception{//而编译类型的异常必须进行处理,否则会报错,调用者抛出的异常可以是之前的异常,或者之前的异常的父类f4();}public static void f4() throws FileNotFoundException {}
}class A{public void f1() throws Exception{}
}class B extends A{@Override//子类抛出的异常必须是父类的子类或者父类的异常public void f1() throws NullPointerException {}
}

6、自定义异常

(1)基本概念

当程序中出现了某些错误,但是该错误信息并没有在Throwable的子类中描述处理,这个时候可以自己设计异常类,用于描述该错误信息。

(2)基本步骤
  1. 定义类,自定义异常类名,继承Exception或者RuntimeException
  2. 如果继承的是Exception,属于编译异常
  3. 如果继承的是RuntimeException,属于运行异常,一般来说都是继承RuntimeException

举例:

//自定义一个异常
//一般情况下,都是自定义为运行时异常,RuntimeException,这样可以使用默认的处理机制
class AgeException extends RuntimeException{public AgeException(String message) {//构造器super(message);}
}
(3) throws对比throw
意义位置后面跟的东西
throws异常处理的方式方法声明处异常类型
throw手动生产异常对象的关键字方法体中异常对象

举例:

public class CustomException {//throwspublic static void main(String[] args) throws Exception{int age = 180;if(!(age >= 18 && age <= 120)){//这里可以根据构造器,设置信息//throwthrow new AgeException("年龄需要在18和120之间");}System.out.println("年龄范围正确");}
}

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

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

相关文章

Anaconda + Pytorch 超详细安装教程

Anaconda Pytorch 超详细安装教程 安装 Anaconda 略,自行百度即可 安装 Pytorch 虚拟环境 第一步 选择 env第二步 创建第三步 填写环境名称和选择 python 版本号 第四步 打开 https://pytorch.org/ 选择 pytorch 版本&#xff0c;我这里选择的是 GPU 版本 即 CUDA 11.8,也…

Unity 3D GridLayoutGroup3D 让子物体对齐,调整子物体间距

Unity 3D GridLayoutGroup3D 让子物体对齐&#xff0c;调整子物体间距 效果 介绍 GridLayoutGroup3D 脚本是一个用于在 Unity 3D 编辑器中创建 3D 网格布局的实用工具。主要用于在 Unity 编辑器中提供一种可视化的方式来设置和调整子物体的位置&#xff0c;同时支持删除脚本时…

LeetCode(39)组合总和⭐⭐

给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数字可以 无限制重复被选取 。如…

iview 选择框远程搜索 指定筛选的参数

问题&#xff1a;开启了filterable之后&#xff0c;选择框是允许键盘输入的&#xff0c;但是会对选择列表进行过滤&#xff0c;如果不想使用再次过滤&#xff0c;可以试下下面这个方法。 场景&#xff1a;输入加密前的关键字筛选&#xff0c;选择框显示加密后的数据 说明一&a…

simulink代码生成(九)—— 串口显示数据(纸飞机联合调试)

纸飞机里面的协议是固定的&#xff0c;必须按照协议配置&#xff1b; &#xff08;1&#xff09;使用EasyHEX协议&#xff0c;测试int16数据类型 测试串口发出的数据是否符合&#xff1f; 串口接收数据为&#xff1a; 打开纸飞机绘图侧&#xff1a; &#xff08;1&#xff09…

MINCO+汽车

对于环境中的静态障碍物&#xff0c;我们构造几何自由空间来约束自我车辆的完整模型以保证安全。 对于动态障碍物&#xff0c;我们使用凸多边形来覆盖其形状。 然后&#xff0c;我们约束小车与障碍物多边形在每一时刻的符号距离[1]的下界近似&#xff0c;以保证小车的安全。 …

软件测试基础理论学习-常见软件开发模型

瀑布模型 背景 瀑布模型的概念最早在1970年由软件工程师Winston W. Royce在其论文《Managing the Development of Large Software Systems》中提出。Royce虽然没有明确提出“瀑布模型”这个术语&#xff0c;但他描述了一种线性的、阶段性的开发流程&#xff0c;各个阶段之间具…

从零学Java - 面向对象 abstract

面向对象 abstract 文章目录 面向对象 abstract1.什么是抽象?1.1 生活中的抽象 2.抽象类2.1 不该被创建对象的类2.2 抽象类的语法2.3 抽象类的作用2.4 抽象类的特点 3.抽象方法3.1 不该被实现的方法3.2 抽象方法的语法3.3 抽象方法的特点 4.总结4.1 抽象类4.2 抽象方法 1.什么…

人生重开模拟器

前言&#xff1a; 人生重开模拟器是前段时间非常火的一个小游戏&#xff0c;接下来我们将一起学习使用c语言写一个简易版的人生重开模拟器。 网页版游戏&#xff1a; 人生重开模拟器 (ytecn.com) 1.实现一个简化版的人生重开模拟器 &#xff08;1&#xff09; 游戏开始的时…

3190个文件!10GB大小!看3D WEB轻量引擎HOOPS Communicator如何高性能读取?

前言&#xff1a; HOOPS Communicator是专为在云端和Web上构建工程应用程序的3D开发工具包。它针对Web工作流、浏览器和工程图形进行了优化。研发小组花了20多年的时间来研发HOOPS Visualize&#xff08;本地3D可视化引擎&#xff09;&#xff0c;他们在这些工作中积累了大量计…

vue3学习 【2】vite起步和开发工具基本配置

vite的简介 官方文档 刚起步学习&#xff0c;所以我们只需要按照官方文档的入门流程即可。推荐阅读一下官网的为什么使用vite vite目前需要的node版本是18&#xff0c;可以参考上一篇文章的安装nvm&#xff0c;用来进行多版本的node管理。 vite安装与使用 npm create vitela…

Python基础篇: 环境安装

Python基础环境使用 一&#xff1a;运行环境Anaconda介绍1、Anaconda搭建1.1、下载方式1.2、安装1.3、验证是否安装成功 2、管理python环境2.1、列出所有环境2.2、创建环境2.3、进入指定虚拟环境2.4、离开虚拟环境2.5、删除虚拟环境 3、依赖管理3.1、安装依赖3.2、卸载依赖3.3、…