Java的异常处理方式
一、异常简介
异常结构图

Throwable是类,Exception和Error都继承了该类,error是因为系统内部错误或者资源耗尽错误,这种情况很少出现,而且error也不允许被抛出在Exception异常中又分为RuntimeException(运行时期异常)和IOException(其他异常),划分两个异常的规则是:由于程序错误导致的异常属于RuntimeException(运行时期异常),比如错误的类型转换,数组越界,访问null指针这类,而像I/O错误这类问题导致的异常属于其他异常;
在Java中,将error类和RuntimeException类的异常称为unchecked(非受查异常)所有的其他异常称为checked(受查异常);受查异常是必须要处理的异常,如果不处理,编译器就不让通过
非受查异常编译时期不会出问题,可以不去处理,虚拟机会处理这些问题,一般是在运行的时候出问题,这些异常一般都是因为数组越界,访问null指针这些问题
在抛出异常时可以抛出Throwable,并且在调用的时候必须进行catch处理。但是这样的设计方法做不好,因为不知道抛出的类型到底是哪种具体问题,无法针对性的处理
二、异常处理的两种方式
2.1 throw
一个方法不仅需要告诉编译器将要返回一个什么值,还要告诉编译器可能发生什么错误,方法应在其首部声明所以可能抛出的异常,这样可以从首部反映出这个方法可能抛出那些checked异常;
throws和throw的区别
- throws
用在方法声明后面,跟的是异常类名
可以跟多个异常类名,用逗号隔开
表示抛出异常,由该方法的调用者来处理
throws表示出现异常的一种可能性,并不一定会发生这些异常 - throw
用在方法体内,跟的是异常对象名
只能抛出一个异常对象名
表示抛出异常,由方法体内的语句处理
throw则是抛出了异常,执行throw则一定抛出了某种异常 - throws异常注意事项:
子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类。
如果父类抛出了多个异常,子类重写父类时,只能抛出相同的异常或者是他的子集,子类不能抛出父类没有的异常
如果父类没有抛出任何异常,那么子类也不可以抛出任何异常,如果子类方法内有异常发生,那么子类只能try,不能throws
在异常处理中,应该捕获那些知道怎么处理的异常,而将那些不知道怎样处理的异常抛出;
2.2 try...catch
try ....catch 的处理方案
每有一个异常就写一个try...catch..写一个try , 多个catch
try{
...
}
catch(异常类名 变量名) {
...
}
catch(异常类名 变量名) {
...
}
try...方式异常处理的方式:
在try里面发现问题后,jvm会帮我们生成一个异常对象,然后把这个异常对象和catch里面的异常进行匹配。如果该异常对象是某个异常类型,就会执行该catch里面的处理信息。在jdk7.0之后出现了一个新的异常处理方案
try{
...
}
catch(异常名1 | 异常名2 | ... 变量 ) {
...
}
这种处理方法的优点是使得代码简洁了,但是不足也很明显,这种方法对于不同的异常,处理方法是一致的,但是如果如果在开发中碰到的是同类型的异常,且有相同的处理方法,那么就可以使用这种异常处理方法,并且,这种特性只有在异常之间不存在子类关系才会使用,即异常1和异常2不能是父类和子类的关系。
finally子句 :
finally子句的处理机制:在执行了try-catch语句后,执行finally子语句,而且无论try部分有没有被执行,即使try-catch语句中执行了return语句,finally语句内的都将被执行,但是有一种情况是例外,如果在try-catch语句中执行了系统退出代码,即system.exit(0),那么finally将不会被执行,而且包括后面所有的语句。
三、自定义异常类
在程序中,有时候会碰到一些用标准类异常也无法描述和处理的问题,这个时候就可以自定义一个异常类,自定义异常类继承Exception,或者继承Exception的子类,自定义的异常类要给出具体的异常处理的操作,一般自定义的异常类有两个构造方法,一个是无参构造,一个是带有描述详细的异常信息的构造,下面是一个自定义的异常类,当出现了某些异常的时候就可以抛出自定义的异常类

Java的异常处理方式的更多相关文章
- Java IO异常处理方式
public class IOException{ // 获取系统默认的行分隔符 private static final String LINE_SEPARATOR = System.getProp ...
- JAVA异常及其异常处理方式
异常处理 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的.比如说,你的代码少了一个分号,那么运行出来结果是提示是错误 java.lang.Error:如果你用Syste ...
- Java的异常处理
Java的异常处理是通过5个关键字来实现的:try,catch,throw,throws,finally.JB的在线帮助中对这几个关键字是这样解释的: Throws: Lists the ...
- Java之异常处理机制
来源:深入理解java异常处理机制 2.Java异常 异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通 ...
- java的异常处理机制(try…catch…finally)
1 引子try…catch…finally恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解.不过,我亲自体验的“教训”告诉我,这个东西可不是想象中的那么简单.听话.不信 ...
- Java中异常处理和设计
在程序设计中,进行异常处理是非常关键和重要的一部分.一个程序的异常处理框架的好坏直接影响到整个项目的代码质量以及后期维护成本和难度.试想一下,如果一个项目从头到尾没有考虑过异常处理,当程序出错从哪里寻 ...
- java的异常处理简介
异常概述 任何一种程序设计语言设计的程序在运行时都有可能出现错误,例如除数为0,数组下标越界,要读写的文件不存在等等. 捕获错误最理想的是在编译期间,但有的错误只有在运行时才会发生. 对于这些错误,一 ...
- 深入理解java的异常处理机制
JAVA异常的概念 异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通 过API中Throwable类的 ...
- Java 六种异常处理的陋习(转)
Java 六种异常处理的陋习 原文链接: http://www.cnblogs.com/Android-and-android/archive/2013/05/02/3054469.html 你觉得 ...
随机推荐
- Flask 教程 第十三章:国际化和本地化
本文翻译自The Flask Mega-Tutorial Part XIII: I18n and L10n 这是Flask Mega-Tutorial系列的第十三部分,我将告诉你如何扩展Microbl ...
- CLAMP 1.0.1 Vulnhub Walkthrough
主机层面端口扫描探测: ╰─ nmap -p1-65535 -A -sV 10.10.202.137 访问web服务 使用dirbuster 加大字段进行目录爆破 http://10.10.202.1 ...
- 苹果_公司开发者账号_申请DUNS number
申请DUNS number 注意事项:a.公司英文名称,例如:北京京城科技有限公司,Beijing Jingcheng Technology Co., Ltd.(Co.和Ltd.都是缩写,中间用“逗号 ...
- Windows下RabbitMQ 的下载、配置、Java实现生产者和消费者例子
RabbitMQ是一个轻量级的消息代理中间件,支持多种消息通信协议,支持分布式部署,支持运行于多个操作系统,具有灵活.高可用等特性.RabbitMQ支持多种协议,其中最为重要的是高级消息队列协议(AM ...
- C# 让你解决方案乱七八糟的DLL放入指定文件夹
嗯,大家的解决方案可能会有许多dll,这样不美观,而且也麻烦. 很多小白都不知道如何将这些dll放到如自己程序的bin文件夹下. 本渣今天来试着将dll复制到指定的文件夹下~ 比如我之前做的一个Win ...
- debug查找主板生产日期
实验环境:XP(XP以上系统没有自带debug) 查询主板生产日期,发现时间为07/02/15 -e命令进行修改日期,尝试将07年改为08年 在查询一下修改完成后的日期,发现日期不变 原因:这块内存是 ...
- CentOS 7怎么删除mariadb
参考链接:https://www.cnblogs.com/ytkah/p/10876824.html
- VirtualBox中重建Host-Only网卡后无法启动虚拟机
问题: 在删除原有VirtualBox Host-Only虚拟网卡并重新添加后,虚拟机可能会无法启动,出现以下错误 Failed to open/create the internal network ...
- Python常用的正则表达式处理函数
Python常用的正则表达式处理函数 正则表达式是一个特殊的字符序列,用于简洁表达一组字符串特征,检查一个字符串是否与某种模式匹配,使用起来十分方便. 在Python中,我们通过调用re库来使用re模 ...
- PHP实现微信提现(企业付款到零钱)
怎么开通企业付款到零钱? 有的商户号的产品中心是没有这个功能的,不过,该功能的pid(product id)是5,只要随便进去某一个产品,在地址栏把pid改为5. 即可进入该功能页面,进行开通,不过要 ...