Java的异常入门

2023-11-01

概念:

异常就是程序出现了不正常的情况,会导致JVM非正常停止,语法错误不算异常体系中

异常体系:

请添加图片描述

编译时异常&运行时异常:

请添加图片描述

虚拟机默认处理方式:
  • 代码中出现异常,程序会先判断有没有处理异常的代码,如果没有就会让调用者(虚拟机)处理,如果有就会走处理的代码。
  • 虚拟机会做两件事情;
  1. 虚拟机会把异常的名称,错误原因及异常出现的位置等信息输出在控制台
  2. 程序停止执行,哪里出现异常就在哪里停止,下面的代码都不会再走
throws方式处理异常:
  • throws: 声明异常,定义在方法括号后面,表示调用该方法会出现异常
  • 编译时异常必须要进行处理,两种处理方案:try…catch …或者 throws,如果采用 throws 这种方案,在方法上进行显示声明,将来谁调用这个方法谁处理
  • 运行时异常因为在运行时才会发生,所以在方法后面可以不写,运行时出现异常默认交给jvm处理

格式:

 public void 方法() throws 异常类名 {}

代码演示:

      public static void main(String[] args) throws ParseException{
          System.out.println("开始"); 
  //        method();    // 这里调用者也没有处理异常,最终还是虚拟机处理
            method2();   // 这里调用者也没有处理异常,最终还是虚拟机处理

          System.out.println("结束");
      }

      //编译时异常
      public static void method2() throws ParseException {
          String s = "2048-08-09";
          SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
          Date d = sdf.parse(s);
          System.out.println(d);
      }

      //运行时异常
      public static void method() throws ArrayIndexOutOfBoundsException {
          int[] arr = {1, 2, 3};
          System.out.println(arr[3]);
      }
throw抛出异常:
  • throw:抛出异常对象,定义在方法里面,由方法体内的语句处理,编译时异常因为在编译时就要检查,所以必须要写在方法后面进行显示声明
  • 这个格式是在方法内的,表示当前代码手动抛出一个异常,下面的代码不用再执行了

格式:

throw new 异常();
      public static void main(String[] args) {
          //int [] arr = {1,2,3,4,5};
          int [] arr = null;
          printArr(arr);//就会 接收到一个异常.
                          //我们还需要自己处理一下异常.
      }

      private static void printArr(int[] arr) {
          if(arr == null){
              //调用者知道成功打印了吗?
              //System.out.println("参数不能为null");
              throw new NullPointerException(); //当参数为null的时候
                                              //手动创建了一个异常对象,抛给了调用者,产生了一个异常
          }else{
              for (int i = 0; i < arr.length; i++) {
                  System.out.println(arr[i]);
              }
          }
      }

抛出异常使用场景:

  • 告诉调用者方法中出现了问题 在方法传递参数有误,没有继续运行下去的意义就要抛出异常,让方法结束
  • 有异常不是直接交给JVM去处理的,而是先看看有没有自己处理,没有才去交给JVM
throws和throw的区别:
throws throw
用在方法声明后面,跟的是异常类名 用在方法体内,跟的是异常对象名
表示声明异常,调用该方法有可能会出现这样的异常 表示手动抛出异常对象,由方法体内的语句处理
try-catch方式处理异常:

好处:为了让代码继续往下执行

格式:

  try {
  	可能出现异常的代码;
  } catch(异常类名 变量名) {
  	异常的处理代码;
  }

执行流程:

  1. 程序从 try 里面的代码开始执行
  2. 出现异常,就会跳转到对应的 catch 里面去执行
  3. 执行完毕之后,程序还可以继续往下执行

代码演示:

      public static void main(String[] args) {
          System.out.println("开始");
          method();
          System.out.println("结束");
      }

      public static void method() {
          try {
              int[] arr = {1, 2, 3};
              System.out.println(arr[3]);
              System.out.println("这里能够访问到吗");
          } catch (ArrayIndexOutOfBoundsException e) {
              System.out.println("你访问的数组索引不存在,请回去修改为正确的索引");
          }
      }
try…catch常见问题:
  1. try没有遇到问题怎么执行?

会把try中所有的代码全部执行完毕,不会执行catch里面的代码

  1. try遇到问题, try下面的还会执行吗?

不会,直接跳转到对应的catch语句中,try下面的代码就不会再执行了,当catch里面的语句全部执行完毕,表示整个体系全部执行完全,继续执行下面的代码

  1. 如果出现的问题没有被捕获,那么程序如何运行?

相当于自己没有处理,默认交给虚拟机处理

  1. 同时有可能出现多个异常怎么处理?

出现多个异常,就要写多个catch,如果多个异常之间存在子父类关系,那么父类一定要写在下面

  1. 为什么不直接使用Exception呢?

根据需求,不同的异常会有不同的处理方式,使用Exception就相当于,不管什么异常都统一处理

Throwable成员方法:
方法名 说明
public String getMessage() 返回此 throwable 的详细消息字符串
public String toString() 返回此可抛出的简短描述
public void printStackTrace() 把异常的错误信息输出在控制台

代码演示:

    public static void main(String[] args) {
        try {
            int[] arr = {2, 3, 4};
            System.out.println(arr[10]);
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println(e.getMessage());
            System.out.println(e.toString());
            e.printStackTrace();
        } finally {
            System.out.println("我是finally,我一定会执行")
        }
    }
finallly:
  • 被finally控制的语句一定会执行,除非JVM退出
  • 在try/catch后可以追加finally代码块,其中的代码一定会被执行,通常用于资源回收。
  • 如果try中有return会先执行finally中的语句再执行try中的returne
  • 如果finally中有returne的,会覆盖其他地方的return。
自定义异常:

为什么要自定义异常?

JDK提供的异常虽然比较多,但是不一定符合我们的需求.,此时我们可以根据自己的业务来定义异常类。
例如年龄负数问题,考试成绩负数问题。

自定义异常的步骤:

  1. 定义异常类
  2. 写继承关系
  3. 提供空参构造
  4. 提供带参构造

代码演示:

异常类:

public class AgeOutOfBoundsException extends RuntimeException {
    public AgeOutOfBoundsException() {}

    public AgeOutOfBoundsException(String message){
        super(message);
    }
}

学生类:

public class Student {
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if(age >= 18 && age <= 25){
            this.age = age;
        }else{
            //自定义异常,指向定义的异常类
            throw new AgeOutOfBoundsException("年龄超出了范围");
        }
    }


    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

测试类:

public class TestStudent {
    public static void main(String[] args) {
        // 键盘录入学生的姓名和年龄,其中年龄为18 - 25岁,超出这个范围是异常数据不能赋值.需要重新录入,一直录到正确为止
        Student s = new Student();
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入姓名");
        String name = sc.nextLine();
        s.setName(name);
        while (true) {
            System.out.println("请输入年龄");
            try {
                String agetest = sc.nextLine();
                int age = Integer.parseInt(agetest);
                s.setAge(age);
                break;
            } catch (NumberFormatException e) {
                System.out.println("请输入一个整数");
                continue;
            } catch (AgeOutOfBoundsException e) {
                System.out.println("请输入规定年龄");
                continue;
            }
        }
        System.out.println(s);
    }
}
Optional:

Optional:可以传递一个为空的的对象,也可以传递一个不为空的
构造方法:

方法名 说明
static Optional of(T value) 获取一个Optional对象,封装的是非null值的对象
static Optional ofNullable(T value) 获取一个Optional对象,Optional封装的值对象可以是null也可以不是null

常用方法:

方法名 说明
T get() 如果存在值,返回值,否则抛出NoSuchElementException
boolean isPresent() 如果存在值,则返回true,否则为false

代码演示:

    public static void main(String[] args) {
        Student s = null;
        Optional<Student> optional = Optional.ofNullable(s);
        //如果封装的是一个null,那么通过get方法再次获取会抛出NoSuchElementException。
        if (optional.isPresent()) {
            Student student = optional.get();
            System.out.println(student);
        } else {
            System.out.println("Optional封装的对象为空");
        }
    }

处理空指针的方法:

方法名 说明
T orElse(T other) 如果不为空,则返回具体的值,否则返回参数中的值
T orElseGet(Supplier<? extends T> supplier) 如果不为空,则返回具体的值,否则返回由括号中函数产生的结果
void ifPresent (Consumer<? super T> action) 如果不为空,则使用该值执行给定的操作,否则不执行任何操作
void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction) 如果不为空,则使用该值执行给定的操作,否则执行给定的基于空的操作

代码演示:

      public static void main(String[] args) {
          //method1();

          //method2();
          //method3();
          //method4();

      }

      private static void method4() {
          //Student s = new Student("zhangsan",23);
          Student s = null;
          Optional<Student> optional = Optional.ofNullable(s);
          //public void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction)、
          //如果不为空,则使用该值执行给定的操作,否则执行给定的基于空的操作。
          optional.ifPresentOrElse(student -> System.out.println(student),
                  ()->System.out.println("为空了"));
      }

      private static void method3() {
          //Student s = new Student("zhangsan",23);
          Student s = null;
          Optional<Student> optional = Optional.ofNullable(s);
          //ifPresent (Consumer<? super T> action)
          //如果不为空,则使用该值执行给定的操作,否则不执行任何操作
          optional.ifPresent(student -> System.out.println(student));
      }

      private static void method2() {
          Student s = new Student("zhangsan",23);
          //Student s = null;
          Optional<Student> optional = Optional.ofNullable(s);
          //orElseGet(Supplier<? extends T> supplier)
          //如果不为空,则返回具体的值,否则返回由括号中函数产生的结果

          Student student = optional.orElseGet(()-> new Student("lisi" , 24));
          System.out.println(student);
      }

      private static void method1() {
          //Student s = new Student("zhangsan",23);
          Student s = null;
          Optional<Student> optional = Optional.ofNullable(s);
          //orElse(T other) 如果不为空,则返回具体的值,否则返回参数中的值
          Student student = optional.orElse(new Student("lisi", 24));
          System.out.println(student);
      }
IO异常的处理:

JDK1.7以前的

1.创建流有异常,使用try处理
2.IO流一定要关闭,在finally中来关闭
3.将fis声明放到try的外面
4.fis可能是null,null不能调用方法,需要判断fis!=null,再做close
5.close有异常,再try
6.read方法有异常,添加一个catch分支

  public static void test02() {
        try (FileInputStream fis = new FileInputStream("day10demo\\abc\\in.txt");
             FileOutputStream fos = new FileOutputStream("day10demo\\abc\11.txt");
        ) {
            fis.read(); // 读取数据
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

JDK1.7的处理方式

会自动关流
try (创建流的代码) {
其他代码;
} catch (异常类名 变量名) {
处理异常代码
}

public static void test01() {
        FileInputStream fis = null;
        try {
            fis = new FileInputStream("day10demo\\abc\\in.txt");
            fis.read();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java的异常入门 的相关文章

  • ARM 异常介绍

    一 中断概念 CPU 在执行当前程序的过程中因硬件或软件的原因插入了另一段程序运行的过程 硬件引起的中断不可预测 随机性 软中断 事先在程序中安排特殊指令 CPU 执行到该类指令时 转去执行相应的一段预先安排好的程序 然后再返回来执行原来的
  • Java——多线程使用详解

    多线程 多线程就是同时执行多个应用程序 需要硬件的支持 同时执行 不是某个时间段同时 cpu切换的比较快 所有用户会感觉是在同时运行 并发与并行 并行 parallel 指在同一时刻 有多条指令在多个处理器上同时执行 并行必须借助于多核cp
  • 自定义ClassLoader,用于加载用户JAR包

    原文地址 http obullxl iteye com blog 651128 Copyright c YMCN Team All rights reserved package com aboy toolkit util import j
  • 日志-Log4J

    日志 程序中的日志可以用来记录程序在运行的时候点点滴滴 并可以进行永久存储 日志和输出语句的区别 输出语句 日志技术 取消日志 需要修改代码 灵活性比较差 不需要修改代码 灵活性比较好 输出位置 只能是控制台 可以将日志信息写入到文件或者数
  • java中常见异常

    为了以后方便查阅 特将java中常见异常记录下来 java lang ArithmeticException 算术条件异常 譬如 整数除零等 java lang ArrayIndexOutOfBoundsException 数组索引越界异常
  • XML语言

    XML XML是可扩展的标记语言 标记语言 通过标签来描述数据的一门语言 标签有时我们也将其称之为元素 可扩展 标签的名字是可以自定义的 XML文件是由很多标签组成的 而标签名是可以自定义的 xml学习网站https www w3schoo
  • NotWritablePropertyException

    ssm项目又来一个低级错误 粗心粗心 异常信息 Caused by org springframework beans NotWritablePropertyException Invalid property mapperLocation
  • 详述Java中的异常

    我是目录 一 异常的解决方案 二 异常的基本用法 三 Java异常体系 四 自定义异常 五 面试阐述 所谓 异常 指的就是程序在 运行时 出现错误时通知调用者的一种机制 我们平时把 System out println 拼写错了 写成了 s
  • android:configChanges属性总结

    http blog csdn net zhaokaiqiang1992 article details 19921703 android中的组件Activity在manifest xml文件中可以指定参数android ConfigChan
  • java虚拟机+分隔符

    java 入门 java 虚拟机 1 java虚拟机的平台可移植性 只要将java虚拟机安装于不同平台 我们编译的 class 文件就可以运行 2 jdk java开发 3 jre java运行时环境 jdk jre 下载安装后必须在环境变
  • java Socket 简单实现客户端与服务器间通信(仿聊天室)

    java Socket TCP协议简单实现客户端与服务器间的通信 打赏 执行效果 启动服务器和3个客户端 进行群聊和私聊 执行过程 服务端 首先创建服务器套接字ServerSocket对象并绑定端口 启动服务器 然后ServerSocket
  • private static final Long serialVersionUID= 1L详解

    我们知道在对数据进行传输时 需要将其进行序列化 在Java中实现序列化的方式也很简单 可以直接通过实现Serializable接口 但是我们经常也会看到下面接这一行代码 private static final Long serialVer
  • String类详解

    目录 一 创建字符串的四种方式 1 直接赋值 2 通过构造方法创建对象 3 通过字符数组创建对象 4 通过String类的静态方法valueOf 任意数据类型 gt 转为字符串 二 字符串比较相等 equals方法 equalsIgnore
  • 感冒交叉感染

    给没有感染的家人服用板蓝根颗粒 窗户每天要打开同风至少在半小时 平时可以用84消毒液拖地或清洗抹布等 病人的生活用品单方 如果条件允许可以按消毒灯 平时让家人多喝水 适当运动 感染者要带口罩 餐具隔离 室内用醋蒸薰消毒 经常开窗通风 未感者
  • Java之单元测试(JUnit单元测试框架)

    一 概述 单元测试就是针对最小的功能单元编写测试代码 Java程序最小的功能单元是方法 所以单元测试就是针对Java方法的测试 进而检查方法的正确性 常规测试有什么问题 只有一个main方法 如果一个方法的测试失败了 其他方法会受到影响 无
  • java实现简单的生成52张牌、三个人洗牌、码牌算法

    定义一个Pocker类 用于定义牌类 package demo public class Poker private String suit 花色 private int rank 数字 构造函数 public Poker String s
  • java I/0操作 FileWriter类

    package filewriter p1 import java io FileWriter import java io IOException public class FileWriterDemo 获取当前系统的换行符 获取指定键指
  • 求一个数组的最大值最小值及其下标

    求一个数组的最大值最小值及其下标 思路 假定一个数为最大值 如果有个数比假定的最大值还大 那么该数就为最大值 最小值同理 使用for循环 public class MaxMin public static void main String
  • java 使用匿名内部类的方式创建线程并设置和获取线程名字

    有些方法需要传入接口的实例或者抽象类的实例对象 比如Thread有一个构造方法 Thread Runnable target 这时可以可以自定义类实现Runnable接口 重写接口中的方法 将自定义类的对象传入构造方法中 也可以使用匿名内部
  • python——异常机制及常见异常汇总

    异常机制本质 异常指程序运行过程中出现的非正常现象 例如用户输入错误 除数为零 需 要处理的文件不存在 数组下标越界等 所谓异常处理 就是指程序在出现问题时依然可以正确的执行剩余的程序 而 不会因为异常而终止程序执行 python 中 引进

随机推荐

  • 使用vim编写C/C++程序

    一 准备工作 1 安装vim 已安装则忽略 sudo apt get install vim 2 安装C的编译器gcc和C 的编译器g 已安装则忽略 sudo apt get install gcc sudo apt get install
  • 用pyhtml2pdf(python)包自动从html生成pdf

    用pyhtml2pdf python 包自动从html生成pdf 1 pyhtml2pdf的使用 代码示例 运行代码需要先安装拓展库 pip install pyhtml2pdf 更多详情 请参见官网 https www cnpython
  • 这些自动化测试框架知识你还不知道?

    这些自动化测试框架知识你还不知道 无论是在自动化测试实践 还是日常交流中 经常听到一个词 框架 之前学习自动化测试的过程中 一直对 框架 这个词知其然不知其所以然 最近看了很多自动化相关的资料 加上自己的一些实践 算是对 框架 有了一些理解
  • android动态刷新主页,Android手把手教大家制作APP首页(下拉刷新、自动加载)

    一 概述 作为一名三年Android开发经验的程序员 今天和大家一起实战一款APP的首页功能 这个首页在我们平时接触中还是很常见的 虽然页面简单 但是里面涉及的功能点还是挺多的 代码如有不足的还望各路同仁指点一二 页面中使用的开发库 整个首
  • 多元线性回归-最小二乘法 最大似然估计

    一 引言 设随机变量 y y y与一般变量 x 1 x 2
  • 【程序】【必须】PID位置环控制,代码+调参

    前面两篇博文已经实现了电机测速和PID速度环控制 在这篇博文中 我们主要说明位置环的代码怎么写以及PID参数怎么调 1 位置环代码实现 写完速度环后位置环就很简单了 在串级PID中 内环的控制量一般是外环控制量的微分 在我们这里 外环是控制
  • 简单图像处理——旋转、缩放、保存

    简单图片处理 一 实验要求 对任意一幅图片分别设计以下两个功能函数 1 任意放大或缩少多少倍 显示图片 存储图片 2 对图片实现任意的旋转 显示图片 存储图片 并调用上面两个函数 测试实现放大2倍和旋转45度 二 实验准备 opencv库
  • (Xcode) 編譯器小白筆記 - LLVM前端Clang

    转自 https juejin im post 6844903716709990414 做笔记之用 Xcode 編譯器小白筆記 LLVM前端Clang 本文为笔记型式呈现 并非全部原创 来源见文末 Compiler Clang LLVM A
  • vector容器与iterator迭代器

    vector容器 vector 是同一种类型的对象的集合 每个对象都有一个对应的整数索引值 和 string 对象一样 标准库负责管理存储元素的相关内存 我们把 vector 称为 容器 是因为它可以包含其他对象 一个容器中的所有对象都必须
  • 理解mnist识别特征(lenet)

    继上一篇做完lenet手写数字测试后 我们对lenet训练结果在mnist测试集上的结果进行粗浅的分析 lenet测试结构如下 我们看到ip1输出特征向量长度为500维 不便于分析 于是我们对该层稍作修改 将500改为2 这样2维的特征向量
  • docker快速安装、启动jenkins

    1 下载镜像 官方推荐下载Blue Ocean镜像 docker操作命令 docker pull jenkinsci blueocean 2 启动镜像 docker操作命令 docker run u root d p 8080 8080 p
  • H3C_ER3100不能添加虚拟服务器解决方案

    文章目录 1 问题 2 解决方法 1 问题 我用chrome工具在H3C ER3100添加虚拟服务器 但不能能添加 2 解决方法 用IE浏览器则可以
  • layer提示框添加多个按钮选择

    function jumpChoose argu 询问框 var index layer confirm 下载文件还是在线预览呢 btn 在线预览 下载 关闭 按钮 shade false 不显示遮罩 function 关闭提示框 laye
  • %3cli%3e连接html页面,www.dwsj.cn

    HTTP 1 1 200 OK Cache Control private Content Length 6336 Content Type text html Charset UTF 8 Server Microsoft IIS 7 0
  • 计算机基础win7桌面操作,计算机基础1实验报告win7基本操作.doc

    WORD格式 分享 PAGE 精品 资料 大学计算机基础 课程 实验报告 学院 年级 专业 姓名 学号 任课教师 上机地点 实验教师 以上由学生填写 西南大学计算机与信息科学学院 计算机基础教育系 2015年10 月18 日 实验成绩记载
  • 蓝桥杯——算法训练——最小距离

    问题描述 数轴上有n个数字 求最近的两个数 即min abs x y 输入格式 第一行包含一个整数n 接下来一行 表示n整数 输出格式 一个整数表示最小距离 样例输入 6 7 3 4 11 9 17 样例输出 1 样例说明 取3和4 数据规
  • 华为OD机试 - 分积木(Java)

    题目描述 Solo和koko是两兄弟 妈妈给了他们一大堆积木 每块积木上都有自己的重量 现在他们想要将这些积木分成两堆 哥哥Solo负责分配 弟弟koko要求两个人获得的积木总重量 相等 根据Koko的逻辑 个数可以不同 不然就会哭 但ko
  • HSQLDB简介

    HyperSQL数据库 HSQLDB 是现代的关系数据库系统 版本2 5 1是全新版本2代码的最新版本 HyperSQL 2 5版与Java 8或更高版本兼容 HyperSQL用于开发 测试和部署数据库应用程序 SQL标准合规性是Hyper
  • winform开发框架常见的分层模式

    winform开发框架 基础的分层模式 可以分为UI层 User Interface BLL层 Business Logic Layer 业务逻辑层 DAL层 Data Access Layer 数据访问层 业务逻辑层 Business L
  • Java的异常入门

    概念 异常就是程序出现了不正常的情况 会导致JVM非正常停止 语法错误不算异常体系中 异常体系 编译时异常 运行时异常 虚拟机默认处理方式 代码中出现异常 程序会先判断有没有处理异常的代码 如果没有就会让调用者 虚拟机 处理 如果有就会走处