百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

《JAVA编程思想》5分钟速成:第12章(异常)

lipiwang 2024-11-16 23:21 7 浏览 0 评论

第十二章、异常

前言:

1、Error 和Exception 有什么区别?

2、try{}里有一个return语句,那么紧跟在这个try后的finally{}里的code会不会被执行,什么时候被执行,在return前还是后?

3、Java 语言如何进行异常处理,关键字:throws、throw、try、catch、finally分别如何使用?

4、运行时异常与受检异常有何异同?

5、列出一些你常见的运行时异常?

6、final, finally, finalize 的区别?


12.1 异常

异常允许我们(如果没有其他手段)强制程序停止运行,并告诉我们出现了什么问题,或者(理想状态下)强制程序处理问题,并返回到稳定状态


12.2 终止与恢复

异常处理理论上有两种基本模型。

终止模型:

长久以来,尽管程序员们使用的操作系统支持恢复模型的异常处理,但他们最终还是转向使用类似“终止模型”的代码,并且忽略恢复行为。

Java支持终止模型(它是Java和C++所支持的模型)。这种模型假设错误非常关键,以至于程序无法返回到异常发生的地方继续执行。


恢复模型(Java支持):

意思是异常处理程序的工作是修正错误,然后重新尝试调用出问题的方法,并认为第二次能成功。

备注:Java场景举例:try-catch exception后,再执行新的代码流程(实现从错误中恢复)。


12.3 创建自定义异常

所有标准异常都有两个构造器:

1. 默认构造器;

2. 接受字符串作为参数,以便能把相关信息放入异常对象的构造器。--Java 建议告知用户异常的具体原因信息。

// FullConstructors.java
class MyException extends Exception{  //自定义Exception建议extends Exception
    public MyException(){} //默认构造器
}
public class FullConstructors{
    public static void g() throws MyException{ //如外抛异常的方法,需添加申明。
        System.out.println("Throwing MyException form g()");
        throw new MyException("Originated in g()"); //主动抛出异常
    }
    public static void main(String[] args){
        try{
            g();
        }catch(MyException e){ //捕获异常
            e.printStackTrace(System.out); //栈轨迹打印
        }
    }
}


12.4 printStackTrace()

Throwable类声明了printStackTrace()方法(栈轨迹打印),它将打印“从方法调用处直到异常抛出处”的方法调用序列。


12.5 为异常先占个位子

可以声明方法将抛出异常,实际上却不抛出。这样做的好处是,为异常先占个位子,以后就可以抛出这种异常而不用修改已有的代码。

在编译时被强制检查的异常称为被检查的异常。


12.6 异常链

异常链:常常会想要在捕获一个异常后抛出另一个异常,并且希望把原始异常的信息保存下来,这被称为异常链。

JDK1.4以后,所有Throwable的子类在构造器中都可以接受一个cause对象作为参数。这个cause就用来表示原始异常,这样通过把原始异常传递给新的异常,使得即使在当前位置创建并了新的异常,也能通过这个异常链追踪到异常最初发生的位置。


三种带cause参数的异常:

在Throwable的子类中,只有三种基本的异常提供了带cause参数的构造器:

Error:用于Java虚拟机报告系统错误。

Exception:

RuntimeException:运行时异常


12.7 受检&不受检异常

受检异常(Checked Exception):不可在编码中忽略(必须主动处理:要么throw要么try-catch)。--会由编译器强制实施编码检测。

不受检异常(UnChecked Exception):运行时异常,RuntimeException(及其子类)类型的异常,可以在代码中忽略,RuntimeException代表的是编程错误(编译器无法检测到异常原因)。


12.8 缺憾:异常丢失

用某些特殊的方式使用finally子句,可能会丢失异常,一种简单的丢失异常的方式是从finally子句中返回。


12.9 finally子句

try-catch-finally{}代码块:一定会执行:

a. 在异常没有被当前的异常处理程序捕获的情况下,异常处理机制也会在跳到更高一层的异常处理程序之前,执行finanlly子句。

b. 当涉及break和continue语句的时候,finally子句也会得到执行。

c. finally子句会在执行return语句前执行,即它总是会执行,所以在一个方法中, 可以从多个点返回,并且可以保证重要的清理工作仍旧会执行。

d. 应用场景:比如IO.closedQuietly().


12.10 异常的限制

a. 当要覆盖方法的时候,只能抛出在基类方法的异常说明里列出的那些异常。这个限制很有用,因为这意味着,当基类使用的代码应用到其派生类对象的时候,一样能够工作。

b. 此限制只针对普通方法有效,对构造器方法无效!

c. 不能基于throw exception的类型,来区分不同的重载方法。


12.11 构造器

如果在构造器内抛出了异常,清理行为也许就不能正常工作了。--不建议在构造中throw Exception.

正确做法:嵌套使用try-catch.


12.12 异常匹配

抛出异常的时候,异常处理系统会按照代码的书写顺序抛出“最近”的处理程序。找到匹配的处理程序之后,它就认为异常将得到处理,然后就不再继续查找。

正确做法:先catch 派生类Exception,再catch基类Exception.


12.13 异常处理原则

a. "Harmful if swallowed" :不要直接吞食所有异常:

在知道如何处理Exception时,才主动catch,否则继续throw,由外层调用方负责处理。

b. 解决Exception后,再继续执行备选代码流程;

c. 只处理当前代码块的Exception,再throw其他异常(不属于当前流程的Exception),由外围代码继续处理。


12.14 总结

“报告”功能是异常的精髓所在。Java坚定地强调将所有的错误都以异常形式报告的这一事实,正是它远远超过诸如C++这类语言的长处之一,因为在C++这类语言中,需要以大量不同的方式来报告错误,或者根本就没有提供错误报告功能。


相关推荐

前端入门——css 网格轨道详细介绍

上篇前端入门——cssGrid网格基础知识整体大概介绍了cssgrid的基本概念及使用方法,本文将介绍创建网格容器时会发生什么?以及在网格容器上使用行、列属性如何定位元素。在本文中,将介绍:...

Islands Architecture(孤岛架构)在携程新版首页的实践

一、项目背景2022,携程PC版首页终于迎来了首次改版,完成了用户体验与技术栈的全面升级。作为与用户连接的重要入口,旧版PC首页已经陪伴携程走过了22年,承担着重要使命的同时,也遇到了很多问题:维护/...

HTML中script标签中的那些属性

HTML中的<script>标签详解在HTML中,<script>标签用于包含或引用JavaScript代码,是前端开发中不可或缺的一部分。通过合理使用<scrip...

CSS 中各种居中你真的玩明白了么

页面布局中最常见的需求就是元素或者文字居中了,但是根据场景的不同,居中也有简单到复杂各种不同的实现方式,本篇就带大家一起了解下,各种场景下,该如何使用CSS实现居中前言页面布局中最常见的需求就是元...

CSS样式更改——列表、表格和轮廓

上篇文章主要介绍了CSS样式更改篇中的字体设置Font&边框Border设置,这篇文章分享列表、表格和轮廓,一起来看看吧。1.列表List1).列表的类型<ulstyle='list-...

一文吃透 CSS Flex 布局

原文链接:一文吃透CSSFlex布局教学游戏这里有两个小游戏,可用来练习flex布局。塔防游戏送小青蛙回家Flexbox概述Flexbox布局也叫Flex布局,弹性盒子布局。它决定了...

css实现多行文本的展开收起

背景在我们写需求时可能会遇到类似于这样的多行文本展开与收起的场景:那么,如何通过纯css实现这样的效果呢?实现的难点(1)位于多行文本右下角的展开收起按钮。(2)展开和收起两种状态的切换。(3)文本...

css 垂直居中的几种实现方式

前言设计是带有主观色彩的,同样网页设计中的css一样让人摸不头脑。网上列举的实现方式一大把,或许在这里你都看到过,但既然来到这里我希望这篇能让你看有所收获,毕竟这也是前端面试的基础。实现方式备注:...

WordPress固定链接设置

WordPress设置里的最后一项就是固定链接设置,固定链接设置是决定WordPress文章及静态页面URL的重要步骤,从站点的SEO角度来讲也是。固定链接设置决定网站URL,当页面数少的时候,可以一...

面试发愁!吃透 20 道 CSS 核心题,大厂 Offer 轻松拿

前端小伙伴们,是不是一想到面试里的CSS布局题就发愁?写代码时布局总是对不齐,面试官追问兼容性就卡壳,想跳槽却总被“多列等高”“响应式布局”这些问题难住——别担心!从今天起,咱们每天拆解一...

3种CSS清除浮动的方法

今天这篇文章给大家介绍3种CSS清除浮动的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。首先,这里就不讲为什么我们要清楚浮动,反正不清除浮动事多多。下面我就讲3种常用清除浮动的...

2025 年 CSS 终于要支持强大的自定义函数了?

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!1.什么是CSS自定义属性CSS自...

css3属性(transform)的一个css3动画小应用

闲言碎语不多讲,咱们说说css3的transform属性:先上效果:效果说明:当鼠标移到a标签的时候,从右上角滑出二维码。实现方法:HTML代码如下:需要说明的一点是,a链接的跳转需要用javasc...

CSS基础知识(七)CSS背景

一、CSS背景属性1.背景颜色(background-color)属性值:transparent(透明的)或color(颜色)2.背景图片(background-image)属性值:none(没有)...

CSS 水平居中方式二

<divid="parent"><!--定义子级元素--><divid="child">居中布局</div>...

取消回复欢迎 发表评论: