《Android应用开发攻略》——2.2 异常处理

2.2 异常处理

Ian Darwin
2.2.1 问题
Java有一个精心定义的异常处理机制,但是需要花费一定的时间学习,才能高效地使用而不至于使用户或者技术支持人员感到沮丧。
2.2.2 解决方案
Java提供了一个Exception层次结构,正确地使用它能够带来相当大的灵活性。Android提供了包括对话框和Toast的多种机制,用于通知用户错误的情况。Android开发者应该熟悉这些机制,并学习高效使用它们的方法。
2.2.3 讨论
Java从推出时就有两类异常(实际上是Exception类的父类Throwable):检测型(checked)异常和非检测型(unchecked)异常。在Java标准版中,编程人员明显要面对这样一个事实:在编译的时候可以检测到某些情况,但其他的情况则无法检测。例如,如果许多PC上安装一个桌面应用程序,可能有些PC上的磁盘空间已经很紧张,无法保存数据;与此同时,其他PC上应用程序依赖的一些文件可能由于用户的错误(而非编程人员的错误)、偶发事件、老鼠咬断电缆等情况而丢失。因此,IOException被当作“检查型异常”,意味着编程人员必须检查这类异常,检查可以通过文件使用方法中的try-catch子句或者方法定义中的throws子句来完成。所有经过良好训练的Java开发人员都知道如下的通用规则:
Throwble是可抛出异常层次结构的根。Exception及其子类(RuntimeException(及其子类)除外)都是检测型异常。其他异常为非检测型异常。
上述规则意味着,Error及其所有子类都是非检测异常(见图2-1)。例如,如果你收到一个VMError异常,说明出现了一个运行时bug,作为应用程序编程人员,对此你没有什么可做的。RuntimeException子类包含了名称超长的ArrayIndexOutOfBoundsException等异常,它和它的友元都是非检测型异常,因为在开发时测试及捕捉这些异常是你的责任(参见第3章)。

image


捕捉异常的场所
早期对检测型异常的(过度)使用导致许多早期Java开发人员编写的代码中到处都是try/catch代码块,部分原因是:在早期的一些培训项目和书籍中,对throws子句的使用没有得到足够的重视。随着Java本身越来越多地转向企业应用,较新的框架(如Hibernate和Spring)出现并强调非检测型异常的使用,这类问题才得到改正。现在,尽可能捕捉靠近用户的异常这一理念已经得到普遍的接受。准备(在程序库或者多个应用程序中)重用的代码不应该尝试错误处理,它们所能做的是所谓“异常转译”(Exception Translation),也就是说,将与技术相关的(通常是检查型)异常转换为通用的非检测型异常。例2-1展示了基本的模式。
例2-1:异常转译
public String readTheFile(String f) {BufferedReader is = null;try {is = new BufferedReader(new FileReader(f));String line = is.readLine();return line;} catch (FileNotFoundException fnf) {throw new RuntimeException("Could not open file " + f, fnf);} catch (IOException ex) {throw new RuntimeException("Could not read file " + f, ex);} finally {if (is != null) {try {is.close();} catch(IOException grr) {throw new RuntimeException("Error on close of " + f, grr);}}}
}

注意,即便在这个代码中,检测型异常的用法也很零乱:is.close()实际上不可能失败,但是因为将它放在finally块中(如果文件打开但是出现了某种错误,这样可以确保文件关闭),就必须使用另一个try-catch结构。因此,检测型异常(很可能)是不好的,在新的API中应该避免使用它,在必要时应该用非检测型异常来扫清道路。
Oracle官方网站和其他人则支持相反的看法。在本书网站上的一条评论中,Al Sutton提出了如下看法:
检测型异常迫使开发人员承认错误的情况可能发生,他们必须思考处理错误的方式。在许多情况下,除了日志和恢复可能没有太多的事情可做,但是开发人员仍然考虑到此类错误发生的时候所应采取的措施。这个例子说明阻止方法调用者区分文件不存在(因而没有必要重新读取)和文件读取问题(文件存在但是无法读取)这两种不同错误情况之间的区别。
Android忠于JavaAPI,有许多检测型异常(包括例子中说明的那些),因此对这些异常应该以相同的方式处理。
对异常的处理
应用程序应该始终报告异常。当我看到捕捉的异常却不采取任何措施的代码时,我总会感到绝望。但是,异常只应该报告一次(不要既进行记录,又转译/重新抛出异常)。普通异常的重点是表示异常情况(正如名称所表示的那样)。因为在Android设备上没有系统管理员或者控制台操作员,所以必须向用户报告异常情况。
你应该考虑通过一个对话框或者Toast通知报告异常。移动设备上的异常处理与台式机有所不同。用户可能正在开车(或者操作其他机器),与人交谈,因此你不应该猜测他们的注意力都在应用程序上。记住,Toast通知只在屏幕上出现几秒钟,你可能会错过它。如果用户必须采取行动更正错误,就应该使用对话框。我知道大部分的示例(甚至在本书中也是一样)使用Toast,这是因为Toast通知需要的代码比对话框少(相反,BlackBerry API简化了对话框:Dialog.alert("mes sage"))。Toast简单地弹出,然后消失。对话框则要求用户确认异常情况,或者授权应用程序执行某些付费操作(例如,启动互联网访问,以便运行需要下载地图数据的应用程序)。
注意: 使用Toast来“弹出”不重要的信息,而使用对话框显示重要的信息并得到确认。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/540843.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

请写出3个Android布局,一起撸一波干货集中营练练手Android(三)布局+实现篇

MPGankIO 布局篇整个App到了这里就开始准备开始实现逻辑啦,有没有点小期待后续如果有需要可以爬一波包包通缉令的数据O(∩_∩)O~~我们的布局采用5.0之后的新布局控件1.CardViewCardView特别的属性如下:android:cardCornerRadius:在布局中设置…

小米净水器压力传感器_净水器中RO的完整形式是什么?

小米净水器压力传感器RO:反渗透 (RO: Reverse Osmosis) RO is an abbreviation of Reverse Osmosis. It is a course of action that aids the RO water purifier to banish unfavorable ions, dissolved solids, and TDS from the water. Reverse osmosis is the c…

即时通讯应用战争开打,到底谁能最终定义我们的交流方式?

题图:风靡亚洲的Line 北京时间4月4日消息,据科技网站TechRadar报道,对业界来说,即时通讯应用是一个巨大的市场,除了专门发力该领域的公司,专注搜索的谷歌和专注社交的Facebook最近几年也都开始深耕此类应用…

离散点自动生成等高线_有限自动机| 离散数学

离散点自动生成等高线有限状态机 (Finite state machine) A finite state machine (FSM) is similar to a finite state automation (FSA) except that the finite state machine "prints" an output using an output alphabet distinct from the input alphabet. Th…

android点击加号,Android仿微信朋友圈点击加号添加图片功能

本文为大家分享了类似微信朋友圈,点击号图片,可以加图片功能,供大家参考,具体内容如下xml:xmlns:app"http://schemas.android.com/apk/res-auto"android:layout_width"match_parent"android:layout_height&qu…

AI 创业公司 Kyndi 获850万美元融资,帮助公司预测未来

雷锋网(公众号:雷锋网)8月10日消息,据外媒报道, Kyndi 是一家总部位于帕洛阿尔托的 AI 创业公司。该公司今天宣布,已经完成了850万美元的 B 轮融资。 本轮融资的资金来源包括 PivotNorth Capital,Darling Ventures 和 …

css max-width_CSS中的max-width属性

css max-widthCSS | 最大宽度属性 (CSS | max-width property) The max-width property is used to help in setting the width of an element to the maximum. Although if the element or content is already larger than the maximum width then the height of that content…

20个编写现代CSS代码的建议

本文翻译自Danny Markov 的20-Tips-For-Writing-Modern-CSS一文。 本文归纳于笔者的Web Frontend Introduction And Best Practices:前端入门与最佳实践中CSS入门与最佳实践系列,其他的关于CSS样式指南的还有提升你的CSS姿势、Facebook里是怎样提升CSS代码质量的。本…

css 相同的css属性_CSS中的order属性

css 相同的css属性CSS | 订单属性 (CSS | order Property) Introduction: 介绍: Web development is an ever-growing field that would never find its end, therefore it is equally necessary to learn new ways to deal with the elements of the web page or …

StoreServ的ASIC架构师必须面向未来做出决断

StoreServ阵列采用特殊硬件,即一套ASIC来加速存储阵列操作,而且其每代阵列都会在这方面进行重新设计。目前的设计为第五代。 作为惠普企业业务公司研究员兼StoreServ架构师,Siamak Nazari当下主要负责第六代ASIC的设计工作。 每代ASIC设计往往…

android网页省略分页器,Android轻量级网页风格分页器

博客同步自:个人博客主页轻量级仿网页风格分页器,和RecycleView封装一起配合使用,也可单独使用,喜欢就star、fork下吧~谢谢目录功能介绍效果图如何引入简单使用依赖github地址功能介绍支持延迟加载分页支持单独分页器组件使用&…

传统存储做到极致也惊人!看宏杉科技发布的CloudSAN

传统存储阵列首先考虑的是高可靠、高性能。那么在成本上、扩展上、部署上就差。 互联网企业带来分布式存储,扩展上、部署上是优势了,但是单节点的可靠性差、数据一致性差、IO延迟大、空间浪费严重,能耗大。 这两者的问题,我想很多…

keil lic_LIC的完整形式是什么?

keil licLIC:印度人寿保险公司 (LIC: Life Insurance Corporation of India) LIC is an abbreviation of the Life Insurance Corporation of India. It is a public segment insurance and investment group corporation in India that generally deals with life …

“云”上存储初显规模 如何架构是关键

在安防系统中,存储设备只是给数据提供存储空间,数据存储的意义更多是为了给上层应用提供二次挖掘。目前的智能分析、大数据、图帧等技术都是基于数据存储做的数据挖掘。为了将二次挖掘应用的性能提升到最高,在优化分析算法的同时,…

【干货】分享总结:MySQL数据一致性

0、导读 沃趣科技数据库工程师罗小波为大家全面分析如何保证MySQL的数据一致性。 1、活动总结 罗小波老师从MySQL的崩溃数据恢复安全性、MySQL复制原理及异步&semi sync复制原理、MySQL主从服务器如何保证数据一致性等多方面分析如何保证MySQL的数据一致性。 分享内容满满的…

设置html按钮点击事件无效果,css怎么设置按钮不能点击?

css怎么设置按钮不能点击?下面本篇文章就来给大家介绍一下使用CSS设置按钮不能点击的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。想要按钮不能点击可以通过设置按钮点击事件失效来实现;而在CSS中&…

计算机图形学与几何造型导论_计算机图形学导论

计算机图形学与几何造型导论历史 (History) The main forerunner sciences to the development of modern computer graphics were the advances in electrical engineering, electronics, and television that took place during the first half of the twentieth century whe…

android 继承listview,Android listView 继承ListActivity的用法

Android listView 继承ListActivity的用法 在手机中经常有列表方式。如果Activity中只有唯⼀⼀个List(这也是通常的情况),可以继承ListActivity来实现。我们用两个例子来学习List。List例子⼀:利用Android自带的List格式步骤⼀:Android XML文…

html页面授权码,spring boot 2.0 整合 oauth2 authorization code授权码模式

oauth2 authorization code 大致流程用户打开客户端后,客户端要求用户给予授权。用户同意给予客户端授权。客户端使用授权得到的code,向认证服务器申请token令牌。认证服务器对客户端进行认证以后,确认无误,同意发放令牌。客户端请…

Net设计模式实例之代理模式(Proxy Pattern)

一、代理模式简介(Brief Introduction) 代理模式(Proxy Pattern)对其他对象提供一种代理以控制对这个对象的访问。 二、解决的问题(What To Solve) 1、远程代理 远程代理,也就是为了一个对象…