Java学习之异常抛出

异常抛出

1. 异常简介

import java.util.ArrayList;public class DemoException1 {public static void main(String[] args) {/*TODO异常:需求:要买菜做饭1.先制定计划做哪些菜 但是计划里面有问题 比如需要做红烧肉,但是菜单里面写的是排骨  -> 编译时期的异常2.计划没问题 菜买回来了 开始做饭,明明要做红烧肉,但是用的是炖锅 -> 表示为运行时期异常3.用铁锅做红烧肉,但是肉放多了,整个锅放了一头猪 装不下 锅太小 -> ERROR (系统性错误无法处理)在Java中异常顶级父类为 Throwable 其子类分为三类1.ERROR  程序运行时,发生的系统性错误2.RuntimeException   程序运行时的一些代码 逻辑错误3.编译异常.. 写代码时期可以避免发生*///        ArrayList<String> list = new ArrayList<>();
//        list.add(1);//        System.out.println(1/0);// 堆内存空间溢出// java.lang.OutOfMemoryError: Java heap spaceString guo = "";while (true){guo += (guo+"一头猪");}}}

2. 异常种类概述

public class DemoException2 {public static void main(String[] args) {/*TODO异常种类:1.编译时期异常① 代码语法错误 代码的位置存在问题② 代码中的一些类型,存在不匹配编译时期的异常,可以通过当前IDEA开发工具来展示2.运行时期的异常① ArithmeticException 除0错误  / by zero② ArrayIndexOutOfBoundsException 数组访问越界③ ConcurrentModificationException 迭代器的数据长度和数组的长度不一致导致的④ ClassCastException 类型转换错误 一般发生在对象强制类型转换的情况下⑤ NullPointerException 空指针异常 对对象进行调用时,其内存地址指向为空注意:特点属于 RuntimeException 下的一个子类在运行时会报错,报错后整个程序停止运行如果当程序出现问题,需要对当前的错误进行捕获处理比如对于 NullPointerException 异常,如果出现,那么可以对其进行重新创建对象继续通过对象的方法进行调用*/
//        System.out.println(1/0);//        int[] ints = new int[3];
//        System.out.println(ints[3]);Exp exp = null;
//        exp.printInfo();// TODO 如果当exp的变量,指向的是为null,那么可以调用其 new 方法重新创建一个对象,赋予给变量if (exp == null) {exp = new Exp();}exp.printInfo();// TODO 上述的方式属于,问题错误没有发生,但是可以提前进行预防//      对于已经发生的错误,如果要进行处理就需要使用 try .. catch 方式进行捕获}//    new Student();
}class Exp {public void printInfo() {System.out.println("这是Exp类中的printInfo方法...");}
}

3. Try/Catch

public class DemoTryCatch {public static void main(String[] args) {/*TODO 异常捕获try...catch (异常的类型 变量名)=> 抓,捕获...Java是一个面向对象的语言,所有的异常类 NullPointerException 也是会有一个对象于是需要使用变量调用对象*//*TODOint[] ints = new int[3];System.out.println(ints[3]);对于代码如果发生错误,那么错误的内容包含有三个方面:Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3at com.shujia.day11.Demo05TryCatch.main(Demo05TryCatch.java:17)异常类型:ArrayIndexOutOfBoundsException异常提示信息:3错误发生位置:at com.shujia.day11.Demo05TryCatch.main(Demo05TryCatch.java:17)对于排除问题的思路:① 获取完整的日志信息 错误的位置不一定就发生在代码指定的位置② 找到错误的类型 根据类型可以确定当前问题发生的范围,同时也可以根据类型将错误捕获,让程序继续运行③ 根据错误的提示信息,寻找线索 提示信息中一般都会打印一些数据④ 根据代码指定的位置,对其进行debug,重新运行,查看每个变量中的数据是否符合要求⑤ 如果因为自身对程序的了解不够,导致程序问题寻找不到,那么尝试换种方式*/Exp exp = getExp();try {exp.printInfo();// 也可以使用它们的父类Exception}catch (NullPointerException exception){// 如果发生错误了,就可以捕获到错误的对象 对该对象调用其方法
//            System.out.println("错误提示信息:"+ exception.getMessage());System.err.println("错误提示信息:"+ exception.getMessage());// 打印整个的错误提示信息exception.printStackTrace();// 如何将日志信息写入到文件中进行保存?}// TODO 当程序被捕获时,那么可以继续运行代码System.out.println("程序执行到这里了....");// TODO 对于多行代码中可能会出现有多个错误,但是也不确定try {System.out.println(3/0);int[] ints = new int[2];System.out.println(ints[2]);// 对于错误类型有两种  ArrayIndexOutOfBoundsException 或者 ArithmeticException}catch (ArrayIndexOutOfBoundsException | ArithmeticException exception){System.out.println("发生错误了...");System.err.println(exception.getMessage());exception.printStackTrace();}/*TODO 对于多种错误类型,可以直接使用父类 Exception 表示由于异常也是一个具体的类,也符合对象的多态特性于是子类异常对象可以指向父类 Exception变量 在调用时,比如 printStackTrace 方法是调用其具体对象的*/try {System.out.println(3/0);int[] ints = new int[2];System.out.println(ints[2]);}catch (Exception exception){
//            exception.getMessage();System.out.println("捕获到了一个异常,但是暂时不知道是什么");exception.printStackTrace();}/*给定的异常太过于具体没有捕获到TODO 需求:当不管代码是否执行正常,都要执行某些代码..比如:如果对Mysql数据库进行操作,操作过程中代码出错了但是Mysql的连接需要进行关闭,否则对于Mysql数据库来说,有一个连接被占用了final格式:try{可能发生错误的代码}catch(){当指定的错误类型,被获取到后的操作}finally{不管代码是否有错误,都会执行..}*/try {String s = null;s.split("");System.out.println(3/0);int[] ints = new int[2];System.out.println(ints[2]);}catch (ArrayIndexOutOfBoundsException | ArithmeticException exception){System.out.println("捕获到了一个异常,但是暂时不知道是什么");exception.printStackTrace();}finally {System.out.println("不管程序是否有错误,该代码块中得代码都会被执行...");}System.out.println("该行被打印表示程序正常执行完成...");}// 假设这是另外一个Jar包或者其他程序员开发的代码 不能进行改变public static Exp getExp() {return null;}
}

4. 自定义异常

public class DemoMyException {// TODO 对于main方法 也可以进行异常抛出,但是一旦遇到异常,程序终止public static void main(String[] args) throws MyDefineException {/*TODO 如果想要定义一个自定义的错误类型throw:通过该关键字可以 抛出一个异常的对象,让其产生错误*/try {/*com.shujia.day11.MyDefineException: 这是自定义的异常at com.shujia.day11.Demo06MyException.main(Demo06MyException.java:11)*/throw new MyDefineException("这是自定义的异常");} catch (MyDefineException exception) {System.out.println(exception.getMessage());exception.printStackTrace();}/*TODO 当在fun函数中定义了一个错误的发生位置,那么对于main方法中,并没有提示其错误那么如何让main方法知道fun函数中可能会发生错误?可以使用throws对异常进行抛出,意思表达为当程序中出现问题,自己不处理交给调用方进行处理由于在main方法中进行调用,那么就需要在main中进行处理*/
//        System.out.println(3/0);//        try {
//            fun(3, 0);  // 经过捕获之后就没有异常了
//        }catch (MyDefineException exception){
//            exception.printStackTrace();
//        }fun(2, 0);System.out.println("程序是否能打印改行?");}//    public static void fun(int a, int b) {
// TODO 方法内不处理,交给调用方进行处理public static void fun(int a, int b) throws MyDefineException,NullPointerException {if (b == 0) {// 直接处理由于有 throw 执行到该处时肯定会发生错误,程序退出...throw new MyDefineException("除数不能为零,抛出异常,请检查逻辑");} else {System.out.println(a / b);}// TODO 方法内自行处理
//        if (b == 0) {
//            try {
//                throw new MyDefineException("除数不能为零,抛出异常,请检查逻辑");
//            } catch (MyDefineException exception) {
//                exception.printStackTrace();
//            }
//        } else {
//            System.out.println(a / b);
//        }}
}class MyDefineException extends Exception {// 如果当遇到自定义的类型时,想要去打印自定义的信息怎么做//   打印信息 可以使用 getMessage()public MyDefineException(String message) {super(message);}
}

5. 异常总结

public class DemoExceptionTxt {public static void main(String[] args) {/*TODO异常操作的总结:1.对于可能会发生错误的代码处理方式① 使用 try catch 进行捕获异常 程序不会终止如果有必须要执行的代码,可以放到 finally 代码块中② 使用 throws 对可能发生的异常进行抛出,交给调用方进行处理如果调用方也不处理,那么遇到错误,程序会终止2.如果想定义错误1.构建一个自定义异常类继承于 Exception 或者其子类2. 通过 throw 方法触发 其异常类的对象finally的作用用于释放资源,在IO流操作和数据库操作中会见到: 比如对Mysql连接进行关闭操作TODO throws和throw的区别:throws用在方法声明后面,跟的是异常类名可以跟多个异常类名,用逗号隔开表示抛出异常,由该方法的调用者来处理throws表示出现异常的一种可能性,并不一定会发生这些异常throw用在方法体内,跟的是异常对象名只能抛出一个异常对象名表示抛出异常,由方法体内的语句处理throw则是抛出了异常,执行throw则一定抛出了某种异常异常可以用埋雷、排雷的方式理解*//*如果catch里面有return语句,请问finally的代码还会执行吗?如果会,请问是在return前还是return后。finally代码是必须要执行的,是在return之前,函数执行完成之前执行*/System.out.println(fun());}public static int fun(){try {System.out.println("return之前...");return 0;
//            System.out.println("return之后...");}catch (Exception exception){System.out.println("异常被捕获...");}finally {System.out.println("finally代码被执行...");}return 1;}
}

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

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

相关文章

QT自适应界面 处理高DPI 缩放比界面乱问题

1.pro文件添加 必须添加要不找不到 QT版本需要 5。4 以上才支持 QT widgets 2.main界面提前处理 // 1. 全局缩放使能QApplication::setAttribute(Qt::AA_EnableHighDpiScaling, true);// 2. 适配非整数倍缩放QGuiApplication::setHighDpiScaleFactorRoundingPolicy(Qt::High…

机器学习入门:sklearn基础教程

Scikit-learn&#xff08;简称sklearn&#xff09;是Python中最受欢迎的机器学习库之一&#xff0c;它提供了丰富的机器学习算法和工具&#xff0c;适用于各种任务和场景。本文将为您介绍sklearn的基础知识和常用功能&#xff0c;带您踏入机器学习的世界。 1. 安装与导入 首先…

OpenCV图像转换处理

1.概述 在深度学习出现之前&#xff0c;图像处理主要有仿射变换与非仿射变换。 2.理论对比 2.1 仿射变换 2.2 非仿射变换 2.3 投射变换 3.代码实现 #include <iostream> #include <opencv2/opencv.hpp>int main(int argc, char** argv) {if(argc ! 2) {std::c…

打印图形(C语言)

一、N-S流程图&#xff1b; 二、运行结果&#xff1b; 三、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int i, j;//循环打印&#xff1b;for (i 0; i < 5; i){//列&#xff1b;for (j 0; j &…

SpringBoot+Vue实现图片滑块和文字点击验证码

一、背景 1.1 概述 传统字符型验证码展示-填写字符-比对答案的流程&#xff0c;目前已可被机器暴力破解&#xff0c;应用程序容易被自动化脚本和机器人攻击。 摒弃传统字符型验证码&#xff0c;采用行为验证码采用嵌入式集成方式&#xff0c;接入方便&#xff0c;安全&#…

光伏电站智能管理平台功能全面介绍

一、介绍 光伏电站智能管理平台专门为了光伏电站服务的融合了项目沟通、在线设计、施工管理、运维工单等多智能光伏管理系统&#xff0c;可以满足光伏电站建设前期沟通、中期建设和后续维护的一体化智能平台&#xff0c;同时通过组织架构对企业员工进行线上管理和数据同步&…

BUU-二维码

题目 解题 打开是一张图片&#xff0c;扫描二维码后显示 secret is here 一时没有思路&#xff0c;看别人的wp https://blog.csdn.net/wusimin432503/article/details/125692459https://blog.csdn.net/weixin_45728231/article/details/120988424?spm1001.2101.3001.6661.1…

显卡、显卡驱动、CUDA、cuDNN、CUDA Toolkit、NVCC、nvidia-smi等概念的区别与联系

在科技日新月异的今天&#xff0c;显卡、显卡驱动、CUDA、cuDNN、CUDA Toolkit、NVCC、nvidia-smi等术语已经成为了科技领域的重要组成部分。本文旨在阐述这些术语之间的区别与联系&#xff0c;帮助您更好地理解它们在技术生态系统中的作用。 一、显卡 显卡&#xff0c;也称为…

AtCoder Beginner Contest 353

AtCoder Beginner Contest 353题解 A - Buildings (atcoder.jp) 读题模拟即可 代码: void solve() {cin>>n;for(int i1;i<n;i)cin>>a[i];int ma[1];for(int i2;i<n;i){if(a[i]>m){cout<<i<<endl;return;}}cout<<-1<<endl; }B…

关于Docker alpine

1.拉取alpine镜像 docker pull alpine 2.运行镜像成为容器 docker run -it --rm alpine sh (--rm标志确保容器在退出时被自动删除。) 3.容器建立后&#xff0c;运行 docker exec -it <container_id> sh 4.进入容器里的 alpine环境 ①.配置安装源 cat >/etc…

(动画详解)LeetCode面试题 02.04.分割链表

&#x1f496;&#x1f496;&#x1f496;欢迎来到我的博客&#xff0c;我是anmory&#x1f496;&#x1f496;&#x1f496; 又和大家见面了 欢迎来到动画详解LeetCode系列 用通俗易懂的动画的动画使leetcode算法题可视化 先来自我推荐一波 个人网站欢迎访问以及捐款 推荐阅读…

qt 窗体嵌入到任务栏

qwidget嵌入到任务栏 #include <QApplication> #include <QWidget> #include <QDebug> #include <windows.h> #include <QVBoxLayout> // 包含 QVBoxLayout 头文件 #include <QLabel> #include <QLineEdit>int main(int argc, char…

[AutoSar]BSW_Diagnostic_003 ReadDataByIdentifier(0x22)介绍

目录 关键词平台说明背景一、请求格式二、常用DID三、响应格式四、NRC五、case 关键词 嵌入式、C语言、autosar、OS、BSW、UDS、diagnostic 平台说明 项目ValueOSautosar OSautosar厂商vector &#xff0c; EB芯片厂商TI 英飞凌编程语言C&#xff0c;C编译器HighTec (GCC)au…

Linux环境下parted工具使用

在工作中&#xff0c;我们经常会遇到大于分区大于2T的磁盘&#xff0c;由于系统盘最大不能超2T&#xff0c;我们会在做raid时将划分VD来进行装系统&#xff0c;但系统自动安装后无法将磁盘全部识别出来&#xff0c;管理员有时会要求手动对分区进行挂载&#xff0c;这个文档介绍…

保研机试之【二叉树后序】--1道题

参考&#xff1a;东哥带你刷二叉树&#xff08;后序篇&#xff09; | labuladong 的算法笔记 建议先过一遍&#xff1a;今天是二叉树~-CSDN博客&#xff0c;very重要&#xff01; 然后再过一遍&#xff08;理解怎么应用方法&#xff09;&#xff1a;保研机试之[三道二叉树习题…

用python写算法——队列笔记

1.队列定义 队列是一种特殊的线性表&#xff0c;它只允许在表的前端进行删除操作&#xff0c;在表的后端进行插入操作&#xff0c;和栈一样&#xff0c;队列是一种操作受限制的线性表。进行插入操作的端称为队尾&#xff0c;进行删除操作的端称为队头。队列中没有元素时&#…

【初级数据结构】队列

目录 前言队列的概念及结构队列的实现队列的结构队列的初始化队列的销毁入队出队取队头元素取队尾元素判断队列是否为空取出队列中元素个数代码测试 完整代码Queue.hQueue.ctest.c 前言 前面我们已经学习了栈&#xff0c;栈是一种后进先出的结构&#xff0c;即LIFO&#xff0c;…

前端工程化,前端监控,工作流,部署,性能

开发规范 创建项目的时候&#xff0c;配置下 ESlint&#xff0c;stylelint&#xff0c; prettier&#xff0c; commitlint 等; ESLint 主要功能&#xff1a; ESLint 是一个静态代码检查工具&#xff0c;用于在 JavaScript 代码中识别和报告模式。它的目标是提供一个插件化的 …

ImageMagick 的基本概念和使用场景

ImageMagick 是一个开源的、跨平台的图像处理软件套件&#xff0c;可以用于创建、编辑、合成、转换图像等各种图像处理操作。它支持超过200多种图像格式&#xff0c;包括常见的JPEG、PNG、GIF&#xff0c;以及一些不常见的格式。ImageMagick 提供了丰富的命令行工具和编程接口&…

electron进程间通信

Electron 应用程序的结构非常相似。 作为应用开发者&#xff0c;你将控制两种类型的进程&#xff1a;主进程 和 渲染器进程。 这类似于上文所述的 Chrome 的浏览器和渲染器进程。 主进程 每个 Electron 应用都有一个单一的主进程&#xff0c;作为应用程序的入口点。 主进程在 N…