解释java程序中的异常机制_Java编程中的异常机制

本文旨在以初学者的角度来学习Java异常的知识,尽量简单,一些细枝末节的知识不会讲述,但不影响对知识的掌握。

(比如try-catch可以嵌套,不太会这么用)

1.什么是异常

我们先举个例子

int x = 10/0;

在IDE里输入这样一个statement,静态检查没有发现其错误。运行后发现抛出算数类异常。

Exception in thread "main" 
java.lang.ArithmeticException: /by zero

“异常”可以理解为字面意思,通常指正常情况无法处理的异常事件。

不过异常和错误不同,程序员无法处理error,如VirtualMachineError、OutOfMemoryError,而Exception本身可以被程序解决,如NullPointException、ArithmeticException、ArrayIndexOutOfBoundException

异常与错误都继承了Throwable类,整体关系如下图:

a0bec4427914a0d7ac2bf24d248f344b.png

Exception,大致可以分为两类

  • RuntimeException 运行时异常 不可检查
  • OtherException 编译期异常 可检查

程序员最需要的关心的:

    • 不是Error,因为大部分遇到了就自认倒霉束手无策
    • 不是RuntimeException,根本不可查
    • 而是OtherException,可查异常;可以通过try-catch捕获异常,或者在方法上加throws抛出异常等

2.异常处理机制

上面谈到对于OtherException可查异常可以try-catch捕获,或者throws抛出异常。接下来就详细介绍如何使用

2.1 try-catch

try {//可能发生异常的地方}
catch (RuntimeException e1){// runtimeException}
catch (Exception e2){//Exception}
finally {//finally的内容一定会执行:无论有没有Exception}

try-catch中可以有多个catch,处理时将依次匹配,注意是依次依次依次,重要的事情说三遍!,一旦先匹配上了,后面的catch就不再匹配,程序员需当心顺序(这里有什么技巧,欢迎大佬补充)

2.2 抛出异常

使用方法:比如有一个静态方法a,在方法名后添加throws IOException(这是一个可检查异常),那么在调用它时,作为一个可检查异常,那么必须要对它try-catch的。如果像下面这样没有try-catch,会出现什么情况呢?

public class Main {public static void a() throws IOException{System.out.println("a");}public static void main(String[] args){a();}
}

根据第一节可知,可检查异常是编译期异常,我使用的工具Intellij IDEA就会报错,不让我通过。只要给它套上一层外衣就好了:

try {a();}
catch (IOException e){//do something}

catch里的Exception类一定要和方法抛出的类是同一个类,或者有从属关系(如IOException是Exception的子类)

有一个有趣的问题,之前我说过只有可检查类有抛出异常的必要,如果我throws一个不可检查的异常会发生什么呢?

public class Main {public static void a() throws RuntimeException{System.out.println("a");}public static void main(String[] args){a();}
}

我在这里先不说结果,感兴趣的小伙伴可以自己尝试一下。(不理解结果的,可以私信我)

注意:throws与throw的区别

我的理解是,

  • throws只是一个保障机制,要求可检查异常必须得到检查。至于是不是真的抛出了异常,还一定。
  • throw才是真正的抛出异常,就算有时候方法没有声明throws(不过建议写,可读性高)。

另外,Java自定义异常类的原理类似,都派生自Exception或某个更小的Exception,有空单独写一篇自定义类的常见用法和注意事项。

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

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

相关文章

配置环境变量

由于写了一个关于生成签名需要配置环境变量,所以在这里顺便把配置环境变量的步骤说一下 1.右键点击计算机,然后点击高级系统设置 2.点击环境变量,下方出现的即为系统变量,双击path就能直接修改, 转载于:https://www.cn…

使用JavaFX AnimationTimer

回想一下,给AnimationTimer起个名字可能不是一个好主意,因为它不仅可以用于动画,还可以用于测量:fps速率,碰撞检测,模拟步骤,游戏主循环等实际上,大部分时间我都看到了AnimationTime…

JavaFX 2 GameTutorial第3部分

介绍 Ť他是与一个六个部分组成的系列的第3部分的JavaFX 2游戏教程。 如果您错过了第1部分和第2部分 ,建议您在开始本教程之前先进行阅读。 回顾第二部分,我讨论了游戏循环的内部工作原理,其中我们使用动画(JavaFX Timeline &…

Selenium WebDriver + python 自动化测试框架

目标 组内任何人都可以进行自动化测试用例的编写 完全分离测试用例和自动化测试代码,就像写手工测试用例一下,编写excel格式的测试用例,包括步骤、检查点,然后执行自动化工程,即可执行功能自动化测试用例,包…

mysql游戏减少积分活动图_plantuml-绘制状态图和活动图和部署图​

背景状态图:对象的所有状态,以及基于事件发生的状态改变的过程;活动图:用例的工作流程;部署图:系统的软硬件物理体系结构;状态图基本语法元素语法说明开始和结束状态[*]标识开始和结束状态箭头-…

windows中当你的键盘无法使用时我们可以用另一种方法哦

1.使用WinR打开cmd窗口 2.输入osk回车就出现了一个虚拟的小键盘啦,当你的键盘坏掉后非常实用哦 转载于:https://www.cnblogs.com/qianzf/p/6780496.html

NetBeans 7.2引入了TestNG

代码生成的优点之一是能够查看如何使用特定的语言功能或框架。 正如我在《 NetBeans 7.2 beta:更快,更有用》一文中所讨论的那样, NetBeans 7.2 beta提供了TestNG集成 。 除了对该功能的单一引用之外,我在该帖子中没有进一步阐述&…

Javascript模块化编程(三):require.js的用法

一、为什么要用require.js? 最早的时候,所有Javascript代码都写在一个文件里面,只要加载这一个文件就够了。后来,代码越来越多,一个文件不够了,必须分成多个文件,依次加载。下面的网页代码&…

几万条数据的excel导入到mysql_【记录】2万多条数据的Excel表格数据导入mysql数据库...

主题刚开始的时候做了两个小方案!第一个是直接Excel处理完导入,但是这个导入的话虽然简单出错率很大!第二个是想直接用php做个小程序直接导入数据,但是想了想2万条数据处理,百分之百浏览器会一直转,最后不知…

JDeveloper中的Java反编译器

Java Decompiler是一个独立的图形实用程序,显示“ .class”文件的Java源代码。 下面是Java Decompiler程序的快照 您可以从这里下载该程序 我将说明如何将此程序用作Jdeveloper中的外部工具 Java Decompiler和Jdeveloper之间的集成 您可以将此程序添加到Jdevelo…

具有Java Kickstart的MongoDB

NoSQL数据库由于其可伸缩性而变得越来越流行。 适当使用时 NoSQL数据库可以提供真正的好处。 MongoDB是使用C 编写的高度可扩展的开源NoSQL数据库。 1.安装MongoDB 您可以根据所使用的操作系统,按照MongoDB官方网站上的说明安装MongoDB,而不会遇到很多麻…

Linux Shell——函数的使用

文/一介书生&#xff0c;一枚码农。 scripts are for lazy people. 函数是存在内存里的一组代码的命名的元素。函数创建于脚本运行环境之中&#xff0c;并且可以执行。 函数的语法结构为&#xff1a; function <function-name> {<code to execute> } 创建函数不需要…

FFmpeg学习2:解码数据结构及函数总结

在上一篇文章中&#xff0c;对FFmpeg的视频解码过程做了一个总结。由于才接触FFmpeg&#xff0c;还是挺陌生的&#xff0c;这里就解码过程再做一个总结。本文的总结分为以下两个部分&#xff1a; 数据读取&#xff0c;主要关注在解码过程中所用到的FFmpeg中的结构体。解码过程中…

JavaFX 2 GameTutorial第4部分

介绍 这是与JavaFX 2游戏教程相关的六个部分系列的第四部分。 如果您错过了第1部分 &#xff0c; 第2部分或第3部分 &#xff0c;我建议您在开始本教程之前仔细阅读它们。 回顾一下&#xff0c;在第3部分中&#xff0c;我为您提供了许多经典街机风格游戏和所使用的不同输入设备…

java构造函数_JAVA的构造函数是怎么写的。万分感谢。路过的请不要嘲笑%_%

展开全部JAVA的构造函数是&#xff1a;SetLocal EnableDelayedExpansionset classpath.for %%c in (lib\*.jar) do set classpath!32313133353236313431303231363533e59b9ee7ad9431333431363030classpath!;%%cset classpath%classpath%;./classes;java com.ham.server.Server。…

C# 中winform的一些属性设置

1 窗体的大小固定住&#xff0c;不能调整其大小 窗体FormBorderStyle 属性设置为 FixedSingle; MaximizeBox 属性设置为false; MinimizeBox 属性设置为 false; 2. 在状态栏中无图标显示 设置为fase即可。 3. 设置窗体的启动位置 方法1&#xff0c; 用代码控制 this.Location …

LiveBos---按钮成下拉

转载于:https://www.cnblogs.com/luhanzhen/p/6802779.html

Solr:创建拼写检查器

在上一篇文章中&#xff0c;我谈到了Solr Spellchecker的工作原理&#xff0c;然后向您展示了其性能的一些测试结果。 现在&#xff0c;我们将看到另一种拼写检查方法。 与其他方法一样&#xff0c;此方法使用两步过程。 相当快速的“候选单词”选择&#xff0c;然后对这些单词…

Django 和 html

下面是对应的形式&#xff0c;自定义的forms 转载于:https://www.cnblogs.com/kilen/p/6804047.html

【Java大系】Java快速教程

感谢原作者&#xff1a;Vamei 出处&#xff1a;http://www.cnblogs.com/vamei Java是面向对象语言。这门语言其实相当年轻&#xff0c;于1995年才出现&#xff0c;由Sun公司出品。James Gosling领导了Java的项目小组。该项目的最初只想为家电设计一门容易移植的语言。然而&am…