Java基础之异常

news2024/11/28 0:56:50

目录

    • 1 异常
      • 1.1 异常的概述
      • 1.2 常见异常类型
      • 1.3 JVM的默认处理方案
      • 1.4 编译时异常的处理方式
        • 1.4.1 异常处理之 try ... catch ... [kætʃ](捕获异常)
        • 1.4.2 异常处理之 throws(抛出异常)
      • 1.5 Throwable 的成员方法
      • 1.6 编译时异常和运行时异常的区别
      • 1.7 finally关键字
      • 1.8 自定义异常

1 异常

1.1 异常的概述

  • 异常:就是程序出现了不正常的情况
    在这里插入图片描述

  • Error:严重问题,不需要处理

  • Exception:称为异常类,它表示程序本身可以处理的问题

  • RuntimeException:在编译期是不检查的,出现问题后,需要我们回来修改代码

  • 非RuntimeException:编译期就必须处理的,否则程序不能通过编译,就更不能正常运行了

1.2 常见异常类型

  • 数组索引越界异常:ArrayIndexOutOfBoundsException
  • 空指针异常:NullPointerException;直接输出没有问题,但是调用空指针的变量的功能就会报错
  • 类型转换异常:ClassCastException
  • 迭代器遍历没有此元素异常:NoSuchElementException
  • 数学操作异常:ArithmeticException
  • 数子转换异常:NumberFormatException

1.3 JVM的默认处理方案

  • 如果程序出现了问题,我们没有做任何处理,最终 JVM 会做默认处理
    • 把异常的名称、异常的原因以及异常出现的位置等信息输出在控制台
    • 有异常的位置程序停止运行

1.4 编译时异常的处理方式

  • 如果程序出现了问题,我们需要自己来处理,有两种处理方案
    • try … catch …
    • throws

1.4.1 异常处理之 try … catch … [kætʃ](捕获异常)

  • 格式1
try {
	可能出现异常的代码;
} catch (异常类名 变量名) {
	异常的处理代码;
} /*catch (异常类名1 变量名1) {
	异常的处理代码;
}*/
  • 格式二
try{
    可能出现异常的代码;
} catch(Exception e){
    e.printStackTrae(); //返回异常信息
}
  • 执行流程

    • 程序从 try 里面的代码开始执行
    • 出现异常,会自动生成一个异常类对象,该异常对象将被提交给Java运行时系统
    • 当Java运行时系统接收到异常对象时,会到 catch 中 去找匹配的异常类,找到后进行异常处理
    • 执行完毕之后,程序还可以继续往下执行
  • 范例

package ceshi;

public class ExceptionDemo {
    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]); //出现异常时,会创建一个异常对象new ArrayIndexOutOfBoundsException();
        } catch (ArrayIndexOutOfBoundsException/Exception e) {
            e.printStackTrace();
            /*开始
            结束
            java.lang.ArrayIndexOutOfBoundsException: 3
            at ceshi.ExceptionDemo.method(ExceptionDemo.java:12)
            at ceshi.ExceptionDemo.main(ExceptionDemo.java:6)*/

        }
    }
}

1.4.2 异常处理之 throws(抛出异常)

  • 格式
throws 异常类名; 
  • 注意:这个格式是跟在方法的括号后面的
  • 编译时异常必须要进行处理,两种处理方案:try … catch… 或者 throws,如果采用 throws 这种方案,将来还是需要调用try … catch …
  • 运行时异常可以不处理,出现问题后,需要我们会来改代码
package ceshi;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class ExceptionDemo {
    public static void main(String[] args)  {
        System.out.println("开始");
//        method();
        try {
            method2();
        } catch (ParseException e) {
            e.printStackTrace();
        }
        System.out.println("结束");
    }

    //编译时异常
    public static void method2() throws ParseException {
        String s = "2020-7-16";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date d = sdf.parse(s); //parse报错:ParseException
        System.out.println(d); //Thu Jul 16 00:00:00 CST 2020
    }
    
    //运行时异常
    public static void method() throws Exception{
        int[] arr = {1,2,3};
        System.out.println(arr[3]);
        /*开始
        Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
        at ceshi.ExceptionDemo.method(ExceptionDemo.java:28)
        at ceshi.ExceptionDemo.main(ExceptionDemo.java:9)*/
    }
}

1.5 Throwable 的成员方法

方法名说明
public String getMessage()返回此 throwable 的详细信息字符串
public String toString()返回此可抛出的简短描述
public void printStackTrace() (常用) [treɪs]把异常的错误信息输出在控制台
package ceshi;

public class ExceptionDemo {
    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]); //出现异常时,会创建一个异常对象new ArrayIndexOutOfBoundsException();
        } catch (ArrayIndexOutOfBoundsException e) {
            //1,public String getMessage() 	返回此 throwable 的详细信息字符串
            System.out.println(e.getMessage()); //Index 3 out of bounds for length 3

            //2,public String toString() 	返回此可抛出的简短描述
            System.out.println(e.toString()); //java.lang.ArrayIndexOutOfBoundsException: 3

            //3,public void printStackTrace() (常用) 	把异常的错误信息输出在控制台
            e.printStackTrace();
            /*java.lang.ArrayIndexOutOfBoundsException: 3
            at ceshi.ExceptionDemo.method(ExceptionDemo.java:12)
            at ceshi.ExceptionDemo.main(ExceptionDemo.java:6)*/
        }
    }
}

1.6 编译时异常和运行时异常的区别

  • Java中的异常被分为两大类:编译时异常和运行时异常,也被称为受检异常和非受检异常
  • 运行时异常就是运行时才报错,编译时异常就是编译时有红线报错
    • RuntimeException类及其子类运行时异常):无需显示处理,也可以和编译时异常一样处理
    • 其余异常编译时异常):必须显示处理,否则程序就会发生错误,无法通过编译(有可能会出现异常,并不是一定会出现)

1.7 finally关键字

  • 用在捕获处理的异常格式中,放在最后面
  • 格式
try{
    //可能出现异常的代码!
}catch{Exception e}{
    e.printStackTrace();
}finally{
    // 无论代码是出现异常还是正常执行,最终一定要执行这里的代码!!
}
  • finally的作用:可以在代码执行完毕后进行资源的释放操作

  • 资源都是实现了Closeable接口的,都自带close()关闭方法

    • try : 出现1次
    • catch:出现0 - N 次(如果有finally那么 catch 可以没有)
    • finally:出现0 - 1 次

1.8 自定义异常

  • 格式
public class 异常类名 enxtends Exception {
	无参构造
	带参构造
} 
  • 异常类
package ceshi;

public class ScoreException extends Exception{
    //自动生成无参,带参构造方法
    public ScoreException() { }

    public ScoreException(String message) {
        super(message);
    }
}
  • 操作类
package ceshi;

public class Teacher {

    public void checkScore(int score) throws ScoreException {
        if(score<0 || score>100) {
            throw new ScoreException("你给的分数有误");
        } else {
            System.out.println("成绩正常");
        }
    }
}
  • 测试类
package ceshi;

import java.util.Scanner;

public class Demo {
    public static void main(String[] args)  {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入分数"); 
        int score = sc.nextInt(); //120

        Teacher t = new Teacher();
//        t.checkScore(score); //checkScore报错,编译时异常需要捕获
        try {
            t.checkScore(score);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

H5 抽奖页面

好久之前就想去写一个这样的示例了&#xff0c;然后就忘了…&#x1f635; &#x1f600;效果 &#x1f587;在线链接 https://linyisonger.github.io/H5.Examples/?name./34.%E6%8A%BD%E5%A5%96%E9%A1%B5%E9%9D%A2.html &#x1f6a7; 图片可能会丢失&#xff0c;都是在网…

大尺度衰落与小尺度衰落

一. 大尺度衰落 无线电磁波信号在收发天线长距离&#xff08;远大于传输波长&#xff09;或长时间范围发生的功率变化&#xff0c;称为大尺度衰落&#xff0c;一般可以用路径损耗模型来描述&#xff0c;路径损耗是由发射功率在空间中的辐射扩散造成的&#xff0c;根据功率传输…

Hadoop开启Yarn的日志监控功能

1.开启JobManager日志 &#xff08;1&#xff09;编辑NameNode配置文件${hadoop_home}/etc/hadoop/yarn-site.xml和mapred-site.xml 编辑yarn-site.xml <!-- Site specific YARN configuration properties --> <configuration><property><name>yarn.…

如何排查网页在哪里发生了内存泄漏?

今天我们来学习用 devtool 的 Performance 和 Memory 工具来找出网页哪里发生了内存泄漏。 Performace 面板 首先我们打开浏览器的 devtool&#xff0c;选择 Performance&#xff08;性能&#xff09;面板&#xff0c;然后将 Memory 选项勾选上。不勾选的话&#xff0c;就不会…

火爆全网的ChatGPT,可以自己上手搭建了。

没有人不知道ChatGPT了吧&#xff1f; ChatGPT&#xff0c;发布于2022年11月30日&#xff0c;来自人工智能研究实验室OpenAI&#xff0c;是一款全新聊天机器人模型&#xff0c;一款人工智能技术驱动的自然语言处理工具。 5天用户破百万&#xff0c;2个月活跃用户破亿。ChatGP…

大学生常用python变量和简单的数据类型、可迭代对象、for循环的3用法

文章目录变量和简单的数据类型下划线开头的对象删除内存中的对象列表与元组debug三酷猫钓鱼记录实际POS机小条打印使用循环找乌龟可迭代对象&#x1f4d7;理解一&#x1f4d8;理解二2️⃣什么是迭代器✔️注意3️⃣迭代器对象4️⃣有关迭代的函数for循环的3用法&#x1f338;I …

C++ 算法主题系列之贪心算法的贪心之术

1. 前言 贪心算法是一种常见算法。是以人性之念的算法&#xff0c;面对众多选择时&#xff0c;总是趋利而行。 因贪心算法以眼前利益为先&#xff0c;故总能保证当前的选择是最好的&#xff0c;但无法时时保证最终的选择是最好的。当然&#xff0c;在局部利益最大化的同时&am…

Seata-Server分布式事务原理加源码 (五) - Seata配置Nacos注册中心和配置中心

Seata配置Nacos注册中心和配置中心 Seata支持注册服务到Nacos&#xff0c;以及支持Seata所有配置放到Nacos配置中心&#xff0c;在Nacos中统一维护&#xff1b; 高可用模式下就需要配合Nacos来完成 具体配置如下 注册中心 Seata-server端配置注册中心&#xff0c;在registr…

【Android学习】下载jar慢和gradle慢的情况

目录 问题出现的原因 解决方法 解决Gradle下载问题&#xff1a;手动安装 解决jar包下载慢问题&#xff1a;更改下载源 问题出现的原因 国内访问谷歌被墙导致访问速度慢或者干脆无法下载 解决方法 解决Gradle下载问题&#xff1a;手动安装 访问官网Gradle | Release Candi…

配置可视化-基于form-render的无代码配置服务(一)

背景 有些业务场景需要产品或运营去配置JSON数据提供给开发去使用&#xff08;后面有实际业务场景的说明&#xff09;&#xff0c;原有的业务流程&#xff0c;非开发人员&#xff08;后面直接以产品指代&#xff09;把数据交给开发&#xff0c;再由开发去更新JSON数据。对于产…

【LeetCode】打家劫舍 III [M](递归)

337. 打家劫舍 III - 力扣&#xff08;LeetCode&#xff09; 一、题目 小偷又发现了一个新的可行窃的地区。这个地区只有一个入口&#xff0c;我们称之为 root 。 除了 root 之外&#xff0c;每栋房子有且只有一个“父“房子与之相连。一番侦察之后&#xff0c;聪明的小偷意识…

山东大学2022操作系统期末

接力&#xff1a;山东大学2021操作系统期末 2022—2023山东大学计算机操作系统期末考试回忆版 简答题(4 10 points) &#xff08;1&#xff09;用户态&#xff0c;核心态是什么 &#xff08;2&#xff09;这种区分对现代操作系统的意义 &#xff08;3&#xff09;printf(“…

基于RK3399+STM32+PID的四轴飞行器跟踪与控制系统设计

系统硬件的总体方案设计 要设计一款具有跟踪功能且飞行稳定的四轴飞行器跟踪系统&#xff0c;首先要保证系 统硬件平台的功能稳定。系统各模块具有不同功能&#xff0c;所以需要根据各模块功能与 性能&#xff0c;进行芯片的选取与硬件电路设计&#xff0c;使系统在经济性、生产…

优维低代码:Legacy Templates 构件模板

优维低代码技术专栏&#xff0c;是一个全新的、技术为主的专栏&#xff0c;由优维技术委员会成员执笔&#xff0c;基于优维7年低代码技术研发及运维成果&#xff0c;主要介绍低代码相关的技术原理及架构逻辑&#xff0c;目的是给广大运维人提供一个技术交流与学习的平台。 连载…

镜像恒流源电路分析

在改进型差动放大器中&#xff0c;用恒流源取代射极电阻RE&#xff0c;既为差动放大电路设置了合适的静态工作电流&#xff0c;又大大增强了共模负反馈作用&#xff0c;使电路具有了更强的抑制共模信号的能力&#xff0c;且不需要很高的电源电压&#xff0c;所以&#xff0c;恒…

Chatgpt取代客服?取代客服的其实另有其人

近来&#xff0c;一款聊天机器人ChatGPT刷爆全网&#xff0c;这也让不少人发出疑问&#xff1a;人工智能真的能大规模取代人类吗&#xff1f;其实&#xff0c;人工智能在很多行业比如电商、金融、医疗教育和制造业等领域已经有许多尝试和应用&#xff0c;最常见的就是大家在生活…

研报精选230214

目录 【行业230214艾瑞股份】中国增强现实&#xff08;AR&#xff09;行业研究报告【行业230214国信证券】信息安全深度剖析5&#xff1a;密评和信创双催化&#xff0c;密码产业开启从1到N【行业230214民生证券】磁性元器件深度报告&#xff1a;乘新能源之风&#xff0c;磁性元…

【数据结构】基础:图的遍历实现(附C++源代码)

【数据结构】基础&#xff1a;图的遍历实现&#xff08;附C源代码&#xff09; 摘要&#xff1a;将会在数据结构专题中开展关于图论的内容介绍&#xff0c;其中包括四部分&#xff0c;分别为图的概念与实现、图的遍历、图的最小生成树以及图的最短路径问题。本文将介绍图的遍历…

Python实现视频自动打码功能,避免看到羞羞的画面

前言 嗨呀嗨呀&#xff0c;最近重温了一档综艺节目 至于叫什么 这里就不细说了 老是看着看着就会看到一堆马赛克&#xff0c;由于太好奇了就找了一下原因&#xff0c;结果是因为某艺人塌房了…虽然但是 看综艺的时候满影响美观的 咳咳&#xff0c;这里我可不是来教你们如何解…

卡诺图化简

1.相关概念 最小项&#xff1a;函数的某个乘积项包含了函数的全部变量&#xff08;原变量或反变量的形式&#xff09;&#xff0c;且每个变量仅出现一次&#xff0c;则这个乘积项为该函数的一个标准积项。 最小项中的原变量记为1&#xff0c;反变量记为0&#xff0c;当变量顺序…