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). 正则表达式是一个字符串,使用单个字符串来描述.用来定义匹配规则,匹配 ...
随机推荐
- 【Visual Installer】如何提醒用户卸载旧版本软件
最近在公司使用VisualInstaller制作安装包. 假设旧产品为isBIMQS,版本号为16.0.0: 新产品依然为isBIMQS,版本号为17.0.0: 那么用户在安装17.0.0的时候如何告 ...
- 【PDF】HTML中嵌入pdf的简单方法
<embed src="> 或者你不想显示某些功能的话: <embed src=">
- Codeforces709
A Kolya is going to make fresh orange juice. He has n oranges of sizes a1, a2, ..., an. Kolya will p ...
- 【51Nod1258】序列求和V4(FFT)
[51Nod1258]序列求和V4(FFT) 题面 51Nod 多组数据,求: \[Ans=\sum_{i=1}^ni^k,n\le 10^{18},k\le50000\] 题解 预处理伯努利数,时间 ...
- 【BZOJ4152】The Captain(最短路)
[BZOJ4152]The Captain(最短路) 题面 BZOJ Description 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求 ...
- 那些你不常用却非常有用的MySql语句和命令
操作数据库 关于数据库的操作比较少,主要是:看.建.用.删. 查看数据库 获取服务器上的数据库列表通常很有用.执行show databases;命令就可以搞定. 1 mysql> show da ...
- Web前端之HTML详解20180327
一.html概述 html就是超文本标记语言的简写,是最基础的网页语言.html通过标签来定义语言,代码都是由标签所组成. 1.html代码从<html>开始</html>结束 ...
- Linux下的tar压缩解压缩命令详解(转)
tar -c: 建立压缩档案-x:解压-t:查看内容-r:向压缩归档文件末尾追加文件-u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个.下面的 ...
- Turkey HSD检验法/W法
sklearn实战-乳腺癌细胞数据挖掘(博主亲自录视频) https://study.163.com/course/introduction.htm?courseId=1005269003&u ...
- Chocolatey - Windows Software Management Automation
What is Chocolatey? Chocolatey is a software management solution unlike anything else you've ever ex ...