DAY18 Excation&File

Exception

JVM在没有做任何异常处理情况下
1.从代码发生错误处,错误之前代码会执行,之后不执行。
2.程序终止后,JVM会进入默认的错误处理流程。
a:错误发生的地方收集错误信息,创建异常对象来描述该错误相关信息(封装)。
b:访问异常对象,获取异常相关信息,输出到控制到窗口。

自己处理异常
try-catch代码块:

{
	try{代码}
	catch(Exception e){处理异常}	
	//一个catch代码块就是一个异常处理器,根据自己需求处理异常
继续运行
}//catch代码块后面的程序会继续运行

1.错误处理至少有一个公共步骤:错误信息输出到日志文件中。
2.try代码块中应该有多个catch异常处理器,对应不同类型错误。
3.try-catch中的多分支异常处理流程

  • 发生错误后,JVM访问异常对象,用异常对象的类型挨个匹配catch异常处理器;如果匹配成功,将异常对象交给异常处理器,并执行异常处理逻辑。(故错误处理器是互斥关系)
  • 若多分支异常处理器声明的异常处理类型有父子关系,父类必须在子类之后。

4.如果要将异常分两种处理,可能会产生冗余代码,可引入或运算符“ | ”,让一个异常处理器同时处理多个类型异常。
5.获取异常信息

  1. getMessage() 获取异常信息,返回字符串
  2. toString() 获取类名和异常信息,返回字符串
  3. printStackTrace() 获取异常类名和异常信息以及异常位置,没有返回值,直接打印到控制台。
  4. printStackTrace(PrintStream s) 将该方法异常内容保存到日志内容中。

throws(只针对编译时异常):

  1. 在方法定义时使用
  2. 申明该方法可能抛出的异常
  3. 可以在语法层面强制方法调用者处理该异常
  4. 当调用的方法用throws关键字申明可能抛出异常,在调用此方法时编译器强制要求,处理此异常,或者用throws继续向上抛出,以此类推一直抛到main方法
  5. 异常类型可以抛出多个,但是列表中不要出现父子关系
  6. 方法覆盖时子类异常列表必须与父类兼容,即子类异常列表和父类异常列表需一样,子类异常列表申明的类型是父类异常列表申明类型的子类(只针对编译时异常)
  7. 如果父类没有异常列表,对于编译时异常,子类也不能有异常列表
  8. 若父类有异常列表,无论编译/运行时异常,都可发生方法覆盖

throw

  1. 在方法体中使用
  2. 主动在程序中抛出异常
  3. 每一次只能抛出确定的某个异常对象
  4. 若抛出编译时异常,则必须和throws配合使用

finally

  1. 被finally修饰的代码块一定会执行
  2. 特殊情况,执行到finally之前,JVM退出(System.exit(0))
  3. finally代码块通常用来释放系统资源

自定义异常

  1. 自定义编译时异常可定义一个异常类继承Exception;同理,运行时异常继承RunTimeException
  2. 意义:专门化异常处理器

关于return的补充
return实质上分两步执行,先把return的值存储在栈帧中的一个区域,再返回,当遇到finally时,第二步被强行阻断,若此时finally语句中return了其他值,则原先的返回值会被覆盖,最终返回新的return值。

发布了12 篇原创文章 · 获赞 1 · 访问量 261

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 游动-白 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览