【Java基础】Java异常处理机制超简单的!!

程序在运行时出现的不正常情况

java把程序运行时出现的各种不正常情况提取属性和行为进行描述,从而出现了各种异常类,也就是异常被面向对象了。

异常名称、异常信息、异常发生的位置

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5(数组下标越界异常类)at Demo2.main(Demo2.java:6)

体系结构

  • Throwable(父类)

    • Error: 表示严重的问题,合理的应用程序不应该试图捕获。

    • Exception: 可以处理的不严重的问题,指示合理的应用程序想要捕获的条件。

      int[] arr=new int[5];
      System.out.println(arr[5]); 
      //throw new ArrayIndexOutOfBoundsException()
      //(数组下标越界异常类)
      System.out.println("hehe");//程序中断,不打印
      

      当发生数组下标越界异常时:

      因为这种异常(ArrayIndex0utOfBoundsException)java内部已经定义了,所以系统会自动创建一个ArrayIndex0utOfBoundsException类的对象。main无法处理这种异常,抛给了JVM。JVM默认的处理异常的方式是,调用异常类对象的printStackTrace方法,printStackTrace方法会打印异常名字、异常信息、异常发生的位置,然后程序中断。

捕获异常

try{可能发生异常的代码
}catch(异常类 参数名){处理异常的代码
}

Throwable常用方法

class MyMath{public int divide(int a,int b){return a/b;//throw new ArithmeticException();}
}
class Demo3{public static void main(String[] args){MyMath math=new MyMath();try{int result=math.divide(5,0);//throw new ArithmeticException();System.out.println(result);}catch (Exception e){//=new ArithmeticException();//System.out.println("除数为0了");String msg=e.getMessage();//异常信息System.out.println(msg);System.out.println(e.toString());//异常类名:异常信息e.printStackTrace();//异常类名:异常信息 异常发生的位置}System.out.println("ok");}
}

在这里插入图片描述

throws声明

  • throws: 声明自己可能发生异常。用在方法的后边,throws后边跟的是异常类。
    一个方法使用throws声明了可能发生异常,那么调用者必须处理,处理方式有两种:

    1. 使用try{}catch(){}处理
    2. 调用者继续使用throws声明自己可能异常

    如果不使用try{}catch(){}处理就会出现程序编译正常,运行出问题

    class MyMath{public int divide(int a,int b)throws Exception{return a/b;}
    }
    class Demo4{public static void main(String[] args)//throws Exception{MyMath math=new MyMath();int result=math.divide(5,0);System.out.println(result);}
    }
    

    在这里插入图片描述

多重异常

  • 当要捕获多个异常时,子类异常要写在父类异常前面。
  • 声明的才是需要处理的
class MyMath{public int divide(int a, int b)throws ArrayIndexOutOfBoundsException,ArithmeticException//声明自己可能发生异常.{int[] arr=new int[3];System.out.println(arr[3]);return a/b;}
}
class Demo5
{public static void main(String[] args){MyMath math=new MyMath();try{int result = math.divide(5,0);System.out.println(result);}catch(ArrayIndexOutOfBoundsException e){System.out.println("下标越界了");}catch(ArithmeticException ee){System.out.println("除数为0了");}//catch(Exception){……} 没有声明的异常不需要处理System.out.println("ok");}
}

在这里插入图片描述

throw

用来手动创建异常类对象,使用了throw,必须处理,处理方式有两种

//手动创建异常类
class FuShuException extends Exception{FuShuException(){}//构造方法,定义异常信息FuShuException(String message){super(message);}
}
class MyMath{                  //声明用throwspublic int divide(int a, int b)throws FuShuException{if(b<0)throw new FuShuException("除数为负数了");//手动创建异常类对象用throwreturn a/b;}
}
class Demo5{                             //声明用throwspublic static void main(String[] args) throws FuShuException{MyMath math=new MyMath();int result=math.divide(5,-4);System.out.println("Hello World!");}
}

手动抛出异常数据

class FuShuException extends Exception{int num;FuShuException(){}FuShuException(String message ){super(message);}FuShuException(String message,int num){super(message);this.num=num;}public int getNum(){return num;}
}
class MyMath{public int divide(int a, int b)throws FuShuException{if(b<0)throw new FuShuException("除数为负数",b);return a/b;}
}
class Demo5 
{public static void main(String[] args){MyMath math=new MyMath();try{int result=math.divide(5,-4);System.out.println(result);}catch(FuShuException e){//=new FuShuException("除数为负数",b);System.out.println(e.getMessage()+":"+e.getNum());}}
}

throw后面不能再跟语句,但抛出异常的方法后可以。

class Demo
{public static void main(String[] args){try{showExce();System.out.println("A");}catch(Exception e){System.out.println("B");}finally{System.out.println("C");}System.out.println("D");}public static void showExce()throws Exception {throw new Exception();}
}
// BCD
class Demo
{	public static void func(){try{throw  new Exception();System.out.println("A");//10 0%执行不了}catch(Exception e){System.out.println("B");}}public static void main(String[] args){try{func();}catch(Exception e){System.out.println("C");}System.out.println("D");}
}

throws和throw的区别

  1. throws用在函数名的后边,throw用在函数内部
  2. throws后边跟的是类名,throw后边跟的是异常类对象

运行时异常

  • 运行时异常

    • 使用了throw不处理,编译照样通过
    • 使用了throws不处理,编译照样通过
    • 编译时不检测的异常
    • RuntimeException及其子类属于运行时异常
    • 运行时异常,不处理编译也通过,原因是这些异常都是因为数据错误造成的异常。程序就应该中断,处理错误的数据。
  • 非运行时异常

    • 使用了throw,必须处理
    • 使用了throws,必须处理
    • 编译时检测的异常
    • Exception及其子类属于非运行时异常

    非运行异常的练习:老师用电脑上课 day13\Demo10.java

    class LanPingException extends Exception{LanPingException(){}LanPingException(String message){super(message);}
    }
    class MaoYanException extends Exception{MaoYanException(){}MaoYanException(String message){super(message);}
    }
    class TeachProgramException extends Exception{TeachProgramException(){}TeachProgramException(String message){super(message);}
    }
    class Teacher{private String name;private Computer computer;Teacher(){}Teacher(String name){this.name=name;computer=new Computer();}public void teach() throws TeachProgramException{try{System.out.println(name+"老师上课");computer.run();}catch(LanPingException e){System.out.println(e.getMessage());computer.reset();}catch (MaoYanException ee){System.out.println(ee.getMessage());throw new TeachProgramException("上课进度受影响");}}
    }
    class Computer
    {private int state=1;public void run() throws LanPingException,MaoYanException{if(state==1)System.out.println("电脑运行");if(state==2)throw new LanPingException("电脑蓝屏");if(state==3)throw new MaoYanException("电脑冒烟");}public void reset(){System.out.println("电脑重启");}
    }
    class Demo6
    {public static void main(String[] args) {Teacher teacher=new Teacher("张三");try{teacher.teach();}catch (TeachProgramException e){System.out.println("老师休息");System.out.println("学生自习");}}
    }
    
try{throw new Exception();
}catch(Exception e)
{try{throw e;}catch(Exception ee){throw new RuntimeException();}
}

try-catch-finally

  • try {// 可能会发生异常的语句
    } catch(ExceptionType e) {// 处理异常语句
    } finally {// 必须执行的代码(清理代码块)
    }
    
  • try{//正常代码}
    finally{//必须执行的代码(释放资源)
    }
    
  • 使用 try-catch-finally 语句时需注意以下几点:

    1. 异常处理语法结构中只有 try 块是必需的,也就是说,如果没有 try 块,则不能有后面的 catch 块和 finally 块;
    2. catch 块和 finally 块都是可选的,但 catch 块和 finally 块至少出现其中之一,也可以同时出现;
    3. 可以有多个 catch 块,捕获父类异常的 catch 块必须位于捕获子类异常的后面;
    4. 不能只有 try 块,既没有 catch 块,也没有 finally 块;
    5. 多个 catch 块必须位于 try 块之后,finally 块必须位于所有的 catch 块之后。
    6. finally 与 try 语句块匹配的语法格式,此种情况会导致异常丢失,所以不常见。

    一般情况下,无论是否有异常拋出,都会执行 finally 语句块中的语句:

    ​ finally{……}子句是异常处理的出口

    在这里插入图片描述

finally与return的执行顺序

  • 当 try 代码块和 catch 代码块中有 return 语句时,finally 仍然会被执行。
  • 执行 try 代码块或 catch 代码块中的 return 语句之前,都会先执行 finally 语句。
  • 无论在 finally 代码块中是否修改返回值,返回值都不会改变,仍然是执行 finally 代码块之前的值。
  • finally 代码块中的 return 语句一定会执行。当 finally 有返回值时,会直接返回该值,不会去返回 try 代码块或者 catch 代码块中的返回值。

在这里插入图片描述

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

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

相关文章

海淘美国礼品卡测评:AE/TT/香草卡与国内卡商、亚马逊测评工作室如何变现?(下)

上回分析的四种变现模式&#xff0c;相信大家已经了解清楚。 塔吉特礼品卡&#xff0c;香草礼品卡&#xff0c;AE礼品卡&#xff0c;百思买礼品卡&#xff0c;亚马逊礼品卡&#xff0c;沃尔玛礼品卡&#xff0c;丝芙兰礼品卡&#xff0c;雷蛇礼品卡&#xff0c;谷歌礼品卡&…

大模型入门(二)—— PEFT

PEFT&#xff08;Parameter-Efficient Fine-Tuning&#xff09;是hugging face开源的一个参数高效微调大模型的工具&#xff0c;里面集成了4中微调大模型的方法&#xff0c;可以通过微调少量参数就达到接近微调全量参数的效果&#xff0c;使得在GPU资源不足的情况下也可以微调大…

《ElementUI 基础知识》el-tree 之“我的电脑”目录结构效果

前言 项目需求&#xff0c;Web 端获取服务器文件夹目录结构。目录数据是调接口获取&#xff0c;本篇略过&#xff0c;直接展现数据&#xff01; 效果 实现 html 代码 8 - 15 行&#xff0c;自定义节点信息&#xff1b;代码 9 - 14 行&#xff0c;判断 icon 显示&#xff1b…

[沫忘录]MySQL储存对象

[沫忘录]MySQL储存对象 视图 视图本质是对原表(基表)显示上的裁剪&#xff0c;可以当作表进行操作&#xff0c;其操作的结果会直接反馈到原表上&#xff0c;即对视图的操作实质上是对原表的操作。 MySQL不仅支持为基表创建视图&#xff0c;同时也支持为视图创建视图。 基本语…

Bumblebee X系列用于高精度机器人应用的新型立体视觉产品

Bumblebee X是最新的GigE驱动立体成像解决方案&#xff0c;为机器人引导和拾取应用带来高精度和低延迟。 近日&#xff0c;51camera的合作伙伴Teledyne FLIR IIS推出一款用于高精度机器人应用的新型立体视觉产品Bumblebee X系列。 Bumblebee X产品图 BumblebeeX系列&#xff…

百度云内容审核快速配置 (java)

为什么要选择百度云 &#xff1f; 因为他免费用一年 首先要先开通百度云内容安全服务 按照操作指引走完整套 ContentCensor Java SDK目录结构** com.baidu.aip├── auth //签名相关类├── http //Http通…

IDEA 好用的插件

图标插件&#xff1a;Atom Material Icons 此插件的作用就是更好的显示各种文件的类别&#xff0c;使之一目了然 汉化包 Chinese ​(Simplified)​ Language Pack / 中文语言包 作用就是 汉化 AI编码助手 GitHub Copilot AI编码助手&#xff1a;提示代码很好用 缺点&#xff1a…

使用perf查看热点函数和系统调用最大延迟函数

1、安装perf工具 1.1、ubuntu 18.04 x86下的安装 安装sudo apt install linux-source sudo apt install linux-tools-uname -r # ubuntu 18.04虚拟机实操可行 1.2、ubuntu 18.04 ARM下的安装 参考 Nvidia Jetson系列产品安装Perf ​ARM64版本的Ubuntu上安装perf 与参考文…

windows11获取笔记本电脑电池健康报告

笔记本电脑的电池关系到我们外出时使用的安全&#xff0c;如果电池健康有问题需要及时更换&#xff0c;windows系统提供了检查电池健康度的方法。 1、打开命令行 1&#xff09;键入 winR 2&#xff09;键入 cmd 打开命令行。 2、在命令行运行如下指令&#xff0c;生成电池健…

DI-engine强化学习入门(九)环境包裹器(Env Wrapper)

在强化学习中&#xff0c;环境&#xff08;Environment&#xff09;是智能体&#xff08;Agent&#xff09;进行学习和互动的场所&#xff0c;它定义了状态空间、动作空间以及奖励机制。Env Wrapper&#xff08;环境包装器&#xff09;提供了一种方便的机制来增强或修改原始环境…

很好的Baidu Comate,使我的编码效率飞起!

文章目录 背景及简单介绍Baidu Comate安装功能演示总结 &#x1f381;写在前面&#xff1a; 观众老爷们好呀&#xff0c;这里是前端小刘不怕牛牛频道&#xff0c;今天牛牛在论坛发现了一款便捷实用的智能编程助手&#xff0c;就是百度推出的Baidu Comate。下面是Baidu Comate评…

MT3034 算术招亲

跟MT3033新的表达式类似&#xff0c;只多了一个括号合法性的判断 #include <bits/stdc.h> using namespace std; const int N 40; bool tag[N]; bool is_op(char c) {return c || c - || c * || c / || c ^; } int priority(char op) { // 优先级排序if (op ||…

vector、heap数组、stack数组访问性能验证

测试目的 本次测试旨在比较不同数据结构&#xff08;vector、数组&#xff09;以及不同访问方法&#xff08;[]、at()、offset&#xff09;在性能上的差异&#xff0c;从而为开发者提供在特定情境下做出最佳选择的依据。 测试代码 测试网址:Quick C Benchmarks 使用GCC9.5 …

微服务项目实战-黑马头条(十三):持续集成

文章目录 项目部署_持续集成1 今日内容介绍1.1 什么是持续集成1.2 持续集成的好处1.3 今日内容 2 软件开发模式2.1 软件开发生命周期2.2 软件开发瀑布模型2.3 软件的敏捷开发 3 Jenkins安装配置3.1 Jenkins介绍3.2 Jenkins环境搭建3.2.1 Jenkins安装配置3.2.2 Jenkins插件安装3…

中仕公考:非应届生能考军队文职吗?

军队文职考试的招生对象主要针对普通高等学校的毕业生以及社会人才&#xff0c;报考条件中并没有限制考生必须是应届毕业生。所以&#xff0c;往届毕业生也是具备报考资格的&#xff0c;只需其满足相关的申请条件即可。 报考人员可大致分为三类&#xff1a;普通高校毕业生、社…

Linux中云盘/磁盘,爆满处理方式

1&#xff1a;du和df命令查看磁盘大小不一致 以下是阿里云服务器云盘使用率 运行 du -sh / 大小为20g 我的服务器大小为40g 按道理说这个云盘使用率应该是百分之五十 而运行 df -h / 这个命令是跟这个云盘使用率差不多的。 1.1分析原因 我安装了mysql&#xff0c;nginx…

微信投票小程序源码系统 独家支持礼物投票 道具投票盈利能力超强 带完整的安装代码包以及搭建教程

微信小程序的快速发展&#xff0c;各类应用场景层出不穷&#xff0c;其中投票小程序因其广泛的适用性和互动性&#xff0c;成为了许多企业和个人推广、活动的首选工具。小编给大家分享一款微信投票小程序源码系统&#xff0c;该系统以其独特的礼物投票和道具投票功能&#xff0…

公众号流量主的收益怎么样?

公众号之前是一个私域平台&#xff0c;没有粉丝基本是没有推荐的&#xff0c;所以之前入门的门槛还是很高的&#xff0c;但是今年公众号和视频号改变了推流的机制&#xff0c;现在发的文章会进入到流量池中&#xff0c;进入到公域流量&#xff0c;所以发布的优质文章会大爆的&a…

大模型驱动的新一代 BI 平台,Sugar BI 开启智慧决策新模式

本文整理自 2024 年 4 月 16 日的 2024 百度 Create 大会上的《大模型驱动的新一代 BI 平台如何开启智慧决策》分享。 全文包括了可视化 BI 分析技术架构、智能图表推荐策略与规则设计、Sugar Bot 智能问数的技术实现流程&#xff0c;以及目前的场景应用等。 1 Sugar BI 产…

C#语言基础

一、复杂数据类型 1. 枚举 1.1 基本概念 1.1.1 枚举是什么 枚举是一个被命名的整型常量的集合&#xff0c;一般用它来表示状态、类型等等 1.1.2 申明枚举和申明枚举变量 申明枚举和申明枚举变量是两个概念 申明枚举&#xff1a;相当于是创建一个自定义的枚举类型 申明枚…