java基础16 捕获、抛出以、自定义异常和 finally 块(以及关键字:throw 、throws)
1、异常的体系
/*
------|Throwable:所有异常和错误的超类
----------|Error(错误):错误一般用于jvm或者硬件引发的问题,所以我们一般不会通过代码去处理错误的
----------|Exception(异常):是需要通过代码去处理
--------------|运行时异常:如果一个方法内部抛出一个运行时异常,那么在方法上面可以声明也可以不声明,调用者可以处理或者不处理
--------------|编译时异常(非运行时异常,受检查异常):如果一个方法内部抛出了一个编译时异常,在方法上面必须要声明,而且调用者也必须处理.
*/
如何区分错误与异常:
1.如果程序出现了不正常的信息,如果不正常的信息以Exception结尾,那么肯定是一个异常.
2.如果是以Error结尾,那么肯定是一个错误.
运行时异常:RunTimeException以及RunTimeException的子类都是运行时异常.
编译时异常:除了运行时异常就是编译时异常.
疑问:为嘛java中编译器会如此严格要求编译时异常,对运行时异常如此宽松?
答:因为运行时异常都是可以通过程序员良好的习惯去避免,所有java编译器就没有那么严格要求处理运行时异常
2、异常的处理
2.1、方式一:捕获异常
捕获异常的格式:
try{
可能发生异常的代码
}catch(捕获异常的类型 变量名){
处理异常的代码
}
2.2、捕获异常要注意的细节
1.如果try块中的代码出现异常过后,那么try-catch块外面的代码可以正常执行.
2.如果try块中出现异常代码,那么try块中出现异常代码的后面的代码是不会执行.
3.一个try块后面可以跟多个catch块的,也就是一个try块可以捕获更多的类型的
4.一个try块中可以捕获多种异常的类型,但是捕获异常类型必须从小到大进行捕获,否则编译错误
疑问一:以后捕获异常处理的时候就是用Exception即可?
答:错误,因为我们现实开发中遇到不同的异常类型时候,我们往往有不同的解决方式。所以要分开不同的异常类型处理
疑问二:下面的信息是通过printStackTrace方法打印出来的,那么异常对象从何而来
| Exception in thread "main" java.lang.ArithmeticException: / by zero at Demo2.div(Demo2.java:12) at Demo2.main(Demo2.java:8) |
答:jvm运行到a/b 这个语句时,发现b为0,除数为0在我们现实生活中属于不正常的情况,jvm一旦发现这种不正常时,那么jvm就马上创建异常对象,并且会调用这个异常对象的printStactTrace的方法来处理
//捕获异常
class Demo14 {
public static void main(String[] args){
int[] arr=null;
div(4,0,arr);
}
public static void div(int a,int b,int[] arr){
try{
int c=a/b; //只要这一步出异常了,那么下面的输出语句就不执行了。所以运行的结果为:除数不能为0...
System.out.println("数组的长度:"+arr.length);
}catch(NullPointerException n){
System.out.println("空指针异常...");
}catch(ArithmeticException a1){
System.out.println("除数不能为0...");
}catch(Exception e){
System.out.println("我是急诊室,包治百病!");
}
}
}
结果图:

2.3、方式二:抛出异常
//抛出异常
class Demo13{
public static void main(String[] args){
try{ //捕获异常
div(4,0);
System.out.println("Hello World!");//上面的语句出现异常,这条语句不执行
}catch(Exception e){
e.printStackTrace();//调用Exception中的printStackTrace()方法 打印异常信息
}
}
//在方法上声明抛出异常
public static void div(int a,int b) throws Exception{
//在同一行....
int c=a/b; throw new Exception();
}
}
结果图:

2.4、抛出异常需要注意的细节
1.如果在一个方法内部抛出了一个异常对象,,那么必须要在方法上声明抛出
2.如果调用了一个声明抛出异常,那么调用者必须处理异常
3.如果一个方法内部抛出了一个异常对象,那么throw语句后面的代码就不会在执行了(一个方法遇到了throws关键字,那么该方法会马上停止执行)
4.在一种情况下,只能抛出一种异常对象.
疑问:何时采用抛出异常?何时使用到捕获异常呢?原则如何?
如果你需要通知调用者,你的代码有问题?那么这个时候使用抛出处理
如果你的代码直接与用户打交道,异常千万不能抛,在抛出的话,给了用户,这个时候就应该捕获异常了
3、throw 与throws关键字
1.throw关键字用于方法内部,throws用于方法的声明上
2.throw抛出的是一个对象,throws抛出的是一个异常类型
3.throw关键字只能抛出一个异常对象,throws可以抛出多个异常类型
4、自定义异常
自定异常类的步骤:自定义一个类继承Exception即可
//自定义异常
class NotIpException extends Exception{
public NotIpException(String message){
super(message);
}
}
//电脑版微信
class Demo15{
public static void main(String[] args) {
//String ip="129.0.1.210";
String ip=null;
try{
weiXin(ip);
}catch(NotIpException e){
e.printStackTrace();//打印异常信息
System.out.println("网线没有插好,或者您忘记缴费已断网!");
}
}
public static void weiXin(String ip) throws NotIpException{
if(ip==null){
throw new NotIpException("网络异常");
}
System.out.println("显示好友列表....");
}
}
结果图:

5、finally关键字
5.1、finally 块
1、finally使用前提,必须存在try块才能使用.
2、finally块在任何情况下都会执行,除了退出jvm的情况
3、finally非常适合资源释放的工作,保证源文件在任何情况下都会被释放
5.2、try块的三种处理方式
方式一:
try{
可能发生异常的代码
}ctach(捕获异常类型 变量名){
处理异常的代码
}
方式二:
try{
可能发生异常的代码
}ctach(捕获异常类型 变量名){
处理异常的代码
}finally{
释放资源的代码
}
方式三:
try{
可能发生异常的代码
}finally{
释放资源的代码
}
方式二的实例:
/*
finally释放资源
*/
import java.io.*;
class Demo2{
public static void main(String[] args){
FileReader fr=null;
try{
//找到目标文件
File f=new File("F:\\作业.txt");
//创建文件与数据的通道s
fr=new FileReader(f);
//读取文件
char[] buf=new char[1024];
int length=0;
length=fr.read(buf);
System.out.println("读取文件到内容"+new String(buf,0,length));
}catch(IOException e){
System.out.println("解析资源失败");
}finally{//释放资源的finally块
try{
fr.close();
System.out.println("释放资源成功");
}catch(IOException e){
System.out.println("释放资源成失败");
}
}
}
}
|
原创作者:DSHORE 作者主页:http://www.cnblogs.com/dshore123/ 原文出自:http://www.cnblogs.com/dshore123/p/8927993.html 欢迎转载,转载务必说明出处。(如果本文对您有帮助,可以点击一下右下角的 推荐,或评论,谢谢!) |
|
检测语言 世界语 中文简体 中文繁体 丹麦语 乌克兰语 乌兹别克语 乌尔都语 亚美尼亚语 伊博语 俄语 保加利亚语 僧伽罗语 克罗地亚语 冰岛语 加利西亚语 加泰罗尼亚语 匈牙利语 南非祖鲁语 卡纳达语 印地语 印尼巽他语 印尼爪哇语 印尼语 古吉拉特语 哈萨克语 土耳其语 塔吉克语 塞尔维亚语 塞索托语 威尔士语 孟加拉语 宿务语 尼泊尔语 巴斯克语 布尔语(南非荷兰语) 希伯来语 希腊语 德语 意大利语 意第绪语 拉丁语 拉脱维亚语 挪威语 捷克语 斯洛伐克语 斯洛文尼亚语 斯瓦希里语 旁遮普语 日语 格鲁吉亚语 毛利语 法语 波兰语 波斯尼亚语 波斯语 泰卢固语 泰米尔语 泰语 海地克里奥尔语 爱尔兰语 爱沙尼亚语 瑞典语 白俄罗斯语 立陶宛语 索马里语 约鲁巴语 缅甸语 罗马尼亚语 老挝语 芬兰语 苗语 英语 荷兰语 菲律宾语 葡萄牙语 蒙古语 西班牙语 豪萨语 越南语 阿塞拜疆语 阿尔巴尼亚语 阿拉伯语 韩语 马其顿语 马尔加什语 马拉地语 马拉雅拉姆语 马来语 马耳他语 高棉语 齐切瓦语 |
世界语 中文简体 中文繁体 丹麦语 乌克兰语 乌兹别克语 乌尔都语 亚美尼亚语 伊博语 俄语 保加利亚语 僧伽罗语 克罗地亚语 冰岛语 加利西亚语 加泰罗尼亚语 匈牙利语 南非祖鲁语 卡纳达语 印地语 印尼巽他语 印尼爪哇语 印尼语 古吉拉特语 哈萨克语 土耳其语 塔吉克语 塞尔维亚语 塞索托语 威尔士语 孟加拉语 宿务语 尼泊尔语 巴斯克语 布尔语(南非荷兰语) 希伯来语 希腊语 德语 意大利语 意第绪语 拉丁语 拉脱维亚语 挪威语 捷克语 斯洛伐克语 斯洛文尼亚语 斯瓦希里语 旁遮普语 日语 格鲁吉亚语 毛利语 法语 波兰语 波斯尼亚语 波斯语 泰卢固语 泰米尔语 泰语 海地克里奥尔语 爱尔兰语 爱沙尼亚语 瑞典语 白俄罗斯语 立陶宛语 索马里语 约鲁巴语 缅甸语 罗马尼亚语 老挝语 芬兰语 苗语 英语 荷兰语 菲律宾语 葡萄牙语 蒙古语 西班牙语 豪萨语 越南语 阿塞拜疆语 阿尔巴尼亚语 阿拉伯语 韩语 马其顿语 马尔加什语 马拉地语 马拉雅拉姆语 马来语 马耳他语 高棉语 齐切瓦语 |
java基础16 捕获、抛出以、自定义异常和 finally 块(以及关键字:throw 、throws)的更多相关文章
- java——异常类、异常捕获、finally、异常抛出、自定义异常
编译错误:由于编写程序不符合程序的语法规定而导致的语法问题. 运行错误:能够顺利的编译通过,但是在程序运行过程中产生的错误. java异常类都是由Throwable类派生而来的,派生出来的两个分支分别 ...
- Java基础16:Java多线程基础最全总结
Java基础16:Java多线程基础最全总结 Java中的线程 Java之父对线程的定义是: 线程是一个独立执行的调用序列,同一个进程的线程在同一时刻共享一些系统资源(比如文件句柄等)也能访问同一个进 ...
- java中异常的抛出:throw throws
java中异常的抛出:throw throws Java中的异常抛出 语法: public class ExceptionTest{ public void 方法名(参数列表) throws 异常列表 ...
- Java 基础【17】 异常与自定义异常
1.异常的分类 Throwable 是所有异常类的基类,它包括两个子类:Exception 和 Error. a. 错误 (Error) 错误是无法难通过程序来解决的,所以程序不应该抛出这种类型的对象 ...
- 在java中,异常抛出点后程序的执行情况
1.在throw语句,即自定义的抛出异常语句后面的代码并不会执行,会提示错误,编译器并不可以正常编译. 2.若在一个条件语句中抛出一个异常,程序可以编译,但不会运行(dead code). 3.若在一 ...
- 【java基础 16】抽象类和接口的区别
导读:前两天闲着没事儿,看了本书,然后写了点代码,在接口里面写了默认方法实现,因为书上说这个特性是从java8开始的,我还特地给测了一下java7. 没过几天,就有一个技术分享会,刚好也是讲java8 ...
- iOS ,呼叫捕获抛出勉未知方法的障碍
iOS 捕获未知方法的调用,避勉抛出异常 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 ...
- Java 基础------16进制转2进制
我们知道,数字8用二进制表示为:1000 用16进制表示为:8 那么我给你一个16进制的数字,0x7f,他的二进制是什么呢? 一个16进制的位数,用4位表示.比如,0x 7 f 其中: 7用4位二进制 ...
- java基础(16):正则表达式、Date、DateFormat、Calendar
1. 正则表达式 1.1 正则表达式的概念 正则表达式(英语:Regular Expression,在代码中常简写为regex). 正则表达式是一个字符串,使用单个字符串来描述.用来定义匹配规则,匹配 ...
随机推荐
- 洛谷 P3398 仓鼠找sugar 解题报告
P3398 仓鼠找sugar 题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而 ...
- Redis的String、Hash类型命令
String是最简单的类型,一个Key对应一个Value,string类型是二进制安全的.Redis的string可以包含任何数据,比如jpg图片或者序列化的对象.最大上限是1G字节. Hash ...
- SCWS中文分词,向xdb词库添加新词
SCWS是个不错的中文分词解决方案,词库也是hightman个人制作,总不免有些不尽如人意的地方.有些词语可能不会及时被收入词库中. 幸好SCWS提供了词库XDB导出导入词库的工具(phptool_f ...
- 使用log4net将日志文件输出为csv格式
我们在编写程序时,会在程序运行过程中记录一些日志.log4net作为一款经久耐用的日志组件,值得我们信赖.在中小型公司中,往往没有专业的日志服务器来处理应用程序产生的日志,而格式化不好的日志文件又为上 ...
- 【莫队】【P3901】 数列找不同
Description 现在有一个长度为\(~n~\)的数列\(~A_1~,~A_2~\dots~A_n~\),\(~Q~\)个询问\(~[l_i~,~r_i]~\),每次询问区间内是否有元素相同 I ...
- 手把手教你如何玩转Activiti工作流
手把手教你如何玩转Activiti工作流 置顶 2018年01月30日 19:51:36 Cs_hnu_scw 阅读数:24023 版权声明:本文为博主原创文章,未经博主允许不得转载. https ...
- Codeforces 578.C Weakness and Poorness
C. Weakness and Poorness time limit per test 2 seconds memory limit per test 256 megabytes input sta ...
- 「Python」pandas入门教程
pandas适合于许多不同类型的数据,包括: 具有异构类型列的表格数据,例如SQL表格或Excel数据 有序和无序(不一定是固定频率)时间序列数据. 具有行列标签的任意矩阵数据(均匀类型或不同类型) ...
- 「Python」19个python编写技巧
1. 交换赋值 2. Unpacking 3. 使用操作符in 4. 字符串操作 5. 字典键值列表 6. 字典键值判断 7. 字典 get 和 setdefault 方法 8. 判断真伪 9. 遍历 ...
- JAVA中反射机制六(java.lang.reflect包)
一.简介 java.lang.reflect包提供了用于获取类和对象的反射信息的类和接口.反射API允许对程序访问有关加载类的字段,方法和构造函数的信息进行编程访问.它允许在安全限制内使用反射的字段, ...