解释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,一经查实,立即删除!

相关文章

keras做多层神经网络

一、 背景与目的 背景:配置好了theano,弄了gpu, 要学dnn方法。 目的:本篇学习keras基本用法, 学习怎么用keras写mlp,学keras搞文本的基本要点。 二、 准备 工具包: theano、numpy、keras等工具包…

配置环境变量

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

使用JavaFX AnimationTimer

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

python列表姓氏_python数据分析实例(六) 中国姓氏数据

bokeh联动柱状图,Excel空间柱状图、空间热力图,Echarts空间柱状图,常用函数:df[工作地_省] df[工作地].str.split(省).str[0]df[工作地_市] df[工作地_市] df[工作地].str.split(省).str[1].str.split(市).str[0]df[工作地_市][…

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

python web.py 404_找不到web.py开发服务器-favicon.ico-404

py API文档引用了一个“web.SEE OTHER()”函数,该函数生成一个303 SEE OTHER响应,将浏览器重定向到另一个位置。(请参见http://webpy.org/docs/0.3/api#web.application)这是一个服务器端的解决方案,它不需要在html文件中更改头;如…

NetBeans 7.2引入了TestNG

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

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

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

[KISSY5系列]淘宝全终端框架 KISSY 5--从零开始使用

KISSY 是淘宝一个开源的 JavaScript 库,包含的组件有:日历、图片放大镜、卡片切换、弹出窗口、输入建议等 一、简介 KISSY 是一款跨终端、模块化、高性能、使用简单的 JavaScript 框架。 除了完备的工具集合如 DOM、Event、Ajax、Anim 等它还提供了经典的…

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

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

JDeveloper中的Java反编译器

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

NGUI学习随笔

一、NGUI的直接用法 1. Attach a Collider:表示为NGUI的某些物体添加碰撞器,如果界面是用NGUI做的,只能这样添加。(注:用Component添加无效)。2. Attach an Anchor:表示为该物体添加了…

Git 修改源地址

git remote set-url origin http://git.xxx.com/xxx/repo.git 转载于:https://www.cnblogs.com/savokiss/p/5892543.html

mysql主从进行扩展_MySQL 主从扩展

MySQL 主从扩展常见问题排查1. 数据不一致:SHOW SLAVE STATUS \G;Last_Errno:1062Last_Error:ErrorDuplicate entryxxxn-66-77for key1on query.Defaultdatabase:guild.Query:insert into pynpcrecord setMapCode xxxn, UpdateTime 2015-08-0700:00:32解决方法: 在从库上将重复…

JRockit – JRCMD有用的命令

自2007年以来,我一直在使用JRockit。我发现它比Hotspot速度慢,但在诊断和分析问题上总是更好。 从去年夏天开始,我一直在为一家国际电信系统供应商工作。 我们在HP OpenCall Convergent Communication Platform之上为电信运营商设计和实施各种…

Spark Streaming整合logstash + Kafka wordCount

1、安装logstash,直接解压即可 测试logstash是否可以正常运行 bin/logstash -e input { stdin { } } output { stdout {codec > rubydebug } } 只获取消息 bin/logstash -e input { stdin { } } output { stdout {codec > plain { format > "%{messag…

js 变量类型

变量类型分为:基础类型和引用类型 基础类型:boolean, string, number, null, undefined, symbol 引用类型: array, object typeof: 判断变量的类型instanceof:判断某个对象是否是另外一个对象的实例主要还是理解这两个判断的不同之处&#xf…