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

欢迎转载,转载务必说明出处。(如果本文对您有帮助,可以点击一下右下角的 推荐,或评论,谢谢!

 
 
 
G
M
T
 
检测语言
世界语
中文简体
中文繁体
丹麦语
乌克兰语
乌兹别克语
乌尔都语
亚美尼亚语
伊博语
俄语
保加利亚语
僧伽罗语
克罗地亚语
冰岛语
加利西亚语
加泰罗尼亚语
匈牙利语
南非祖鲁语
卡纳达语
印地语
印尼巽他语
印尼爪哇语
印尼语
古吉拉特语
哈萨克语
土耳其语
塔吉克语
塞尔维亚语
塞索托语
威尔士语
孟加拉语
宿务语
尼泊尔语
巴斯克语
布尔语(南非荷兰语)
希伯来语
希腊语
德语
意大利语
意第绪语
拉丁语
拉脱维亚语
挪威语
捷克语
斯洛伐克语
斯洛文尼亚语
斯瓦希里语
旁遮普语
日语
格鲁吉亚语
毛利语
法语
波兰语
波斯尼亚语
波斯语
泰卢固语
泰米尔语
泰语
海地克里奥尔语
爱尔兰语
爱沙尼亚语
瑞典语
白俄罗斯语
立陶宛语
索马里语
约鲁巴语
缅甸语
罗马尼亚语
老挝语
芬兰语
苗语
英语
荷兰语
菲律宾语
葡萄牙语
蒙古语
西班牙语
豪萨语
越南语
阿塞拜疆语
阿尔巴尼亚语
阿拉伯语
韩语
马其顿语
马尔加什语
马拉地语
马拉雅拉姆语
马来语
马耳他语
高棉语
齐切瓦语
  世界语
中文简体
中文繁体
丹麦语
乌克兰语
乌兹别克语
乌尔都语
亚美尼亚语
伊博语
俄语
保加利亚语
僧伽罗语
克罗地亚语
冰岛语
加利西亚语
加泰罗尼亚语
匈牙利语
南非祖鲁语
卡纳达语
印地语
印尼巽他语
印尼爪哇语
印尼语
古吉拉特语
哈萨克语
土耳其语
塔吉克语
塞尔维亚语
塞索托语
威尔士语
孟加拉语
宿务语
尼泊尔语
巴斯克语
布尔语(南非荷兰语)
希伯来语
希腊语
德语
意大利语
意第绪语
拉丁语
拉脱维亚语
挪威语
捷克语
斯洛伐克语
斯洛文尼亚语
斯瓦希里语
旁遮普语
日语
格鲁吉亚语
毛利语
法语
波兰语
波斯尼亚语
波斯语
泰卢固语
泰米尔语
泰语
海地克里奥尔语
爱尔兰语
爱沙尼亚语
瑞典语
白俄罗斯语
立陶宛语
索马里语
约鲁巴语
缅甸语
罗马尼亚语
老挝语
芬兰语
苗语
英语
荷兰语
菲律宾语
葡萄牙语
蒙古语
西班牙语
豪萨语
越南语
阿塞拜疆语
阿尔巴尼亚语
阿拉伯语
韩语
马其顿语
马尔加什语
马拉地语
马拉雅拉姆语
马来语
马耳他语
高棉语
齐切瓦语
         
 
 
 
文本转语音功能仅限200个字符
 
  选项 : 历史 : 反馈 : Donate 关闭

java基础16 捕获、抛出以、自定义异常和 finally 块(以及关键字:throw 、throws)的更多相关文章

  1. java——异常类、异常捕获、finally、异常抛出、自定义异常

    编译错误:由于编写程序不符合程序的语法规定而导致的语法问题. 运行错误:能够顺利的编译通过,但是在程序运行过程中产生的错误. java异常类都是由Throwable类派生而来的,派生出来的两个分支分别 ...

  2. Java基础16:Java多线程基础最全总结

    Java基础16:Java多线程基础最全总结 Java中的线程 Java之父对线程的定义是: 线程是一个独立执行的调用序列,同一个进程的线程在同一时刻共享一些系统资源(比如文件句柄等)也能访问同一个进 ...

  3. java中异常的抛出:throw throws

    java中异常的抛出:throw throws Java中的异常抛出 语法: public class ExceptionTest{ public void 方法名(参数列表) throws 异常列表 ...

  4. Java 基础【17】 异常与自定义异常

    1.异常的分类 Throwable 是所有异常类的基类,它包括两个子类:Exception 和 Error. a. 错误 (Error) 错误是无法难通过程序来解决的,所以程序不应该抛出这种类型的对象 ...

  5. 在java中,异常抛出点后程序的执行情况

    1.在throw语句,即自定义的抛出异常语句后面的代码并不会执行,会提示错误,编译器并不可以正常编译. 2.若在一个条件语句中抛出一个异常,程序可以编译,但不会运行(dead code). 3.若在一 ...

  6. 【java基础 16】抽象类和接口的区别

    导读:前两天闲着没事儿,看了本书,然后写了点代码,在接口里面写了默认方法实现,因为书上说这个特性是从java8开始的,我还特地给测了一下java7. 没过几天,就有一个技术分享会,刚好也是讲java8 ...

  7. iOS ,呼叫捕获抛出勉未知方法的障碍

    iOS 捕获未知方法的调用,避勉抛出异常 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 ...

  8. Java 基础------16进制转2进制

    我们知道,数字8用二进制表示为:1000 用16进制表示为:8 那么我给你一个16进制的数字,0x7f,他的二进制是什么呢? 一个16进制的位数,用4位表示.比如,0x 7 f 其中: 7用4位二进制 ...

  9. java基础(16):正则表达式、Date、DateFormat、Calendar

    1. 正则表达式 1.1 正则表达式的概念 正则表达式(英语:Regular Expression,在代码中常简写为regex). 正则表达式是一个字符串,使用单个字符串来描述.用来定义匹配规则,匹配 ...

随机推荐

  1. 如何使用火狐下的两款接口测试工具RESTClient和HttpRequester发送post请求

    Chrome下有著名的Postman,那火狐也有它的左膀右臂,那就是RESTClient和HttpRequester.这两款工具都是火狐的插件,主要用来模拟发送HTTP请求,HTTP请求最常用的两种方 ...

  2. 【HDU4689】Derangement(动态规划)

    [HDU4689]Derangement(动态规划) 题面 Vjudge 给定一个\(+-\)组成的字符串,长度为\(n\). 如果第\(i\)位是\(+\),那么\(p_i>i\),否则\(p ...

  3. linux内核分析第3章&第18章读书笔记

    linux内核分析第3章&第18章读书笔记 第三章 进程管理 进程:处于执行期的程序(目标码存放在某种存储介质上) 包含资源:可执行程序代码,打开的文件,挂起的信号,内核内部数据,处理器状态, ...

  4. 小Q与内存

    Portal --> broken qwq Description (这个描述好像怎么都精简不起来啊qwq) 大概是说你的计算机有1GB的物理内存,按照Byte寻址,其物理地址空间为\(0\si ...

  5. 【loj2133】【NOI2015】品酒大会

    Portal --> loj2133 Solution 虽然说这题貌似用后缀树之类的好像会更加简短一点..但是还是因为在智力康复所以就还是用后缀数组好了嗯(哇好感动啊难得那么顺畅写了一道noi的 ...

  6. bzoj4715 囚人的旋律

    4715: 囚人的旋律 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 74  Solved: 48[Submit][Status][Discuss] ...

  7. SpringBoot(三) :Spring boot 中 Redis 的使用

    前言: 这一篇讲的是Spring Boot中Redis的运用,之前没有在项目中用过Redis,所以没有太大的感觉,以后可能需要回头再来仔细看看. 原文出处: 纯洁的微笑 SpringBoot对常用的数 ...

  8. Ubuntu 14.04.3 window10双系统情遇到'Disconnected: You are now offline'问题

    笔电是win10系统,单独开除50G做了一个Ubuntu系统,安装的是14.04.03版本,安装成功后,发现wifi连接不上,选择wifi并输入密码后提示:“Disconnected: You are ...

  9. poj 3636

    Nested Dolls http://poj.org/problem?id=3636 Time Limit: 1000MS   Memory Limit: 65536K Total Submissi ...

  10. ASP.NET站点Web部署(一键发布的实现)

    在开发过程中经常需要发布到开发环境.测试环境或者预发布环境上给其他同事进行测试验证效果等等,每次发布都要备份,拷贝,修改配置文件等等重复操作非常的麻烦,效率大打折扣,而web部署提供了这样的解决方案: ...