第74-75集:异常机制、trycatchfinallyreturn执行顺序、捕获异常、声明异常throw、方法重写中异常的处理、手动抛出异常

异常的处理办法一:捕获异常

try

  1. try语句指定了一段代码,该段代码就是一次捕获并处理的范围。在执行过程中,当任意一条语句产生异常时,就会跳过该段中后面的代码。代码中可能会产生并抛出一种或几种类型的异常对象,它后面的catch语句要分别对这些异常做相应的处理。

  2. 一个try语句必须带有至少一个catch语句块或一个finally语句块 。【只有try和finally未必可以】

  3. 当异常处理的代码执行结束以后,是不会回到try语句去执行尚未执行的代码。

catch

  1. 每个try语句块可以伴随一个或多个catch语句,用于处理可能产生的不同类型的异常对象。

  2. 常用方法:

    1. toString ( ):显示异常的类名和产生异常的原因。

    2. getMessage( ):只显示产生异常的原因,但不显示类名。

    3. printStackTrace( ):用来跟踪异常事件发生时堆栈的内容。【最常用】

    这些方法均继承自Throwable类

  3. Catch捕获异常时的捕获顺序:

    1. 如果异常类之间有继承关系,在顺序安排上需注意。越是顶层的类,越放在下面。再不然就直接把多余的catch省略掉。

finally

有些语句,不管是否发生了异常,都必须要执行,那么就可以把这样的语句放到finally语句块中。
通常在finally中关闭程序块已打开的资源,比如:文件流、释放数据库连接等。

package com.test074;import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;public class Test074 {public static void main(String[] args){FileReader reader = null;File a = new File("/Users/wangtao/Desktop/a.txt");try{a.createNewFile();reader = new FileReader("/Users/wangtao/Desktop/a.txt");char temp = (char)reader.read();System.out.println("读出的内容"+temp);} catch(FileNotFoundException e){System.out.println("文件没有找到");} catch(IOException e){e.printStackTrace();System.out.println("文件读取错误");} finally {System.out.println("不管有无异常都将被执行");try {reader.close();//这是一个用来关闭对象的方法} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
}

try、catch、finally、return执行顺序

  1. 执行try,catch,给返回值赋值

  2. 执行finally

  3. return

package com.test074;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;public class Test074_1 {public static void main(String[] args){String str = new Test074_1().openFile();System.out.println(str);}String openFile(){try{System.out.println("aaa");FileInputStream fis = new FileInputStream("/Users/wangtao/Desktop/a.txt");int a = fis.read();System.out.println("bbb");return "step1";} catch(FileNotFoundException e) {System.out.println("catch");e.printStackTrace();return "step2";//先去finally再回到这里。} catch(IOException e){e.printStackTrace();return "step3";} finally {System.out.println("finally!!!");//return "FFF";//不要在finally中使用return}}
}

异常的处理办法二:声明异常:throws子句

  1. 当Checked Exception产生时,不一定立刻处理它,可以再把异常Throws出去。

  2. 在方法中使用try-chatch-finally这个方法处理异常。在一些情况下,当前方法并不需要处理发生的异常,而是向上传递给调用它的方法处理。

  3. 如果一个方法中可能产生某种异常,但是并不能确定如何处理这种异常,则应根据异常规范在方法的首部声明该方法可能抛出的异常。

  4. 如果一个方法抛出多个已检查异常,就必须在方法的首部列出所有的异常,之间以逗号隔开。

  5. 方法重写中声明异常原则:子类声明的异常范围不能超过父类声明的范围。包含如下意思:

    1. 父类没有声明异常,子类也不能。

    2. 不可抛出原有方法抛出异常类的父类或上层类。

    3. 抛出的异常类型的数目不可以比原有的方法抛出的还多(不是指个数)。

package com.test075;import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.ParseException;/*** @author wangtao*    测试子类重写父类方法*    1. 子类抛出的异常不能是父类的上层类,其范围也不能超过父类*    2. 子类抛出的异常种类不能比父类多*    3. 父类不抛出异常,子类不能抛出。*    */
public class Test075_1 {public static void main(String[] args){}class A {public void method() throws IOException{}}class B extends A {public void method() throws FileNotFoundException{//子类抛出的异常范围不超过父类范围}}class C extends A {public void method(){//子类不抛出异常}}class D extends A {public void method() throws IOException,ParseException{//子类抛出的异常种类比父类多,报错}}class E extends A {public void method() throws IOException,FileNotFoundException{//子类抛出的异常范围数量虽然多过父类,但是它没有超过父类范围}}class F extends A {public void method() throws IOException,ArithmeticException{//同上}}
}

异常的处理办法三:手动抛出异常

  1. Java异常类对象除在程序执行过程中出现异常时由系统自动生成并抛出,也可根据需要手工创建并抛出。

  2. 在捕获一个异常前,必须有一段代码先生成异常对象并把它抛出。这个过程我们可以手工做,也可以由JRE来实现,但是他们调用的都是throw子句。

  3. 对于一个已经存在的异常类,抛出该类异常对象过程如下:

    1. 找到一个合适的异常类。

    2. 创建一个该类的对象。

    3. 将对象抛出。

package com.test075;import java.io.File;
import java.io.FileNotFoundException;public class Test075_2 {public static void main(String[] args){File f = new File("/Users/wangtao/Desktop/aaa.txx");if(!f.exists()){try {throw new FileNotFoundException("File can`t be found!");} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
}

第76集:异常机制、自定义异常、异常总结

自定义异常

  1. 在程序中,可能会遇到任何标准异常类都没有充分的描述清楚的问题,这种情况下可以创建自己的异常类【从Exception类或者它的子类派生一个子类即可】

  2. 习惯上,定义的类应该包含2个构造器:一个是默认的构造器,另一个是带有详细信息的构造器

package com.test076;/*** @author wangtao* 测试自定义异常*/
public class Test076 {public static void main(String[] args){try {new TestMyException().test();} catch (MyException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}class MyException extends Exception {public MyException(){}public MyException(String message){super(message);}
}class TestMyException{void test() throws MyException {}
}

使用异常机制建议

  1. 要避免使用异常处理代替错误处理,这样会降低程序的清晰性,并且效率低下。

  2. 处理异常不可以代替简单测试--- 只在异常情况下使用异常机制

  3. 不要进行小粒度的异常处理---应该将整个任务包装在一个Try语句块中

  4. 异常往往在高层处理(先了解!后面做项目会说!)

总结

  1. 一个图

  2. 五个关键字(try,catch,finally,throws,throw)

  3. 先逮小的,再逮大的

  4. 异常和重写的关系

  5. 自定义异常

【135天】尚学堂高淇Java300集视频精华笔记(74-76)相关推荐

  1. 【133天】尚学堂高淇Java300集视频精华笔记(71-72)

    第71集:常用类/file类/打印目录树状结构/递归算法 课堂代码 package com.test071;import java.io.File;public class Test071 {publ ...

  2. 【138天】尚学堂高淇Java300集视频精华笔记(84)

    第84集:太阳系模型/基本类的封装/Star类的建立 本集知识点 将对象尽可能的抽象,可以有效减少代码量,比如此例中的Star类 package com.test084_087_solar;impor ...

  3. 【131天】尚学堂高淇Java300集视频精华笔记(65-66)

    第65集:常用类Date类的使用JDk源码分析 Date时间类(java.util.Date) 在标准Java类库中包含一个Date类.它的对象表示一个特定的瞬间,精确到毫秒. Date()分配一个D ...

  4. 【147天】尚学堂高淇Java300集视频精华笔记(108-109)

    第108集:容器equals和hashcodeJDK源代码分析 本集知识点 Java中规定,若两个对象equals比较后内容相等(为true),则hashCode必须相等,反之不然.[原因见内存分析图 ...

  5. 【153天】尚学堂高淇Java300集视频精华笔记(122-123)

    叨叨两句(2017.7.8) 我现在发现我太适合当程序员了,稍微懂点知识后想法就一堆一堆的,哈哈. 今天敲下面这个冒泡排序时感觉太特么好了.原来学编程最快乐的事情就是懂了一些知识后,把它变成可以在电脑 ...

  6. 【160天】尚学堂高琪Java300集视频精华笔记(129)

    明天开始,专栏增加一个黑马程序员的课程更新. 其它容器收尾讲解 队列Queue与Deque(单向队列与双向队列) Enumeration(较老的接口,JDK1.5前使用频繁,维护旧系统会用到) Has ...

  7. 尚学堂 高琪JAVA300集第十一章作业 编程题答案

    本人 JAVA初学者 在寻找这一方面的答案时没有看见 ,本着分享的精神 自己做了出来 也就传上来了 水平有限 存在有错的地方或者改进的方法 ,望大佬们可以提出 万分感谢. 1.1. 设计一个多线程的程 ...

  8. 【JavaSE】高淇300集第一季笔记

    ------------------------------------------------------1.如何学习---------------------------------------- ...

  9. python 递归函数_Python尚学堂高淇|P82P86面向对象和面向过程的区别LEGB规则nonlocal_global递归函数阶乘计算案例...

    P82-递归函数-阶乘计算案例 #使用递归函数计算阶乘def factorial(n):if n==1:return 1else:return n*factorial(n-1)result=facto ...

最新文章

  1. 2017第17周五当前困境思考2
  2. Java有线程安全的set吗?
  3. sharedPreferences的用法
  4. 修改了xml要不要重新起服务器,关于设置:Eclipse每次运行项目时都会修改server.xml(运行-在服务器上运行)...
  5. Java多态向上转型作用,热度飙升!
  6. Win11内存占用高怎么办,Win11内存占用高解决方法
  7. 数学建模竞赛最全竞赛案例分析总结
  8. 计算机的好与坏作文,电脑“坏”了的作文
  9. sql-update 用法
  10. <<视觉问答>>2022:MuKEA: Multimodal Knowledge Extraction and Accumulation for Knowledge-based VQA
  11. HDU4699Editor
  12. 【持续更新】【产品相关名词解释】CBD、BOM、DFM、EVT、EOF、CMF、PP、MP等
  13. html详细笔记及练习的几个例子
  14. 代码的坏味道与重构技术
  15. 【养生之道】男人养生的秘诀
  16. 使用Qemu在Mac上安装虚拟机
  17. 今日学习——冒泡排序
  18. 计算机编辑字块教学ppt,文字处理与编辑排版.ppt
  19. Information Gain 计算 python实现
  20. easyrecovery新版64位下载一键轻松找回丢失数据

热门文章

  1. java多线程 -- ReadWriteLock 读写锁
  2. 使用golang的http模块构建redis读写查api
  3. uva 11080(二分图染色)
  4. 【转载】请问Silverlight 获取客户端网卡mac码
  5. ASP.NET 2.0 学习笔记 1: session 与 script 应用
  6. php pclzip.lib.php,php使用pclzip类实现文件压缩的方法(附pclzip类下载地址)
  7. Eureka-eureka原理分析
  8. 工作中用到的设计模式?
  9. 请解释各种自动装配模式的区别?
  10. JSR303自定义校验注解