Exception在Java中是表示异常的一个类。它是Throwable的子类。

而Exception的子类RuntimeException是一个特殊的异常类,在代码中不需要对此类进行throw,而是由JVM来抛出。

很多时候,我们的某些问题,可以通过一个try/catch简单的解决掉,但是前提是要了解Exception。

很多人对于Exception的理解,仅仅是在于IDE会提示错误,然后补全一下try/catch就完事了,不会考虑到为什么,以至于自己编写的库交给别人,别人也不愿意使用。

首先要明白的是,除了RuntimeException以外的其他Exception都是需要通过throw抛出的。如果被调用的方法中有通过throw抛出异常,则需要在调用的方法中使用try/catch来进行捕获处理或者通过在方法尾使用throws将异常继续抛出。

这都是最基础的。

对于Exception,要明白两点:

  1. 异常捕获,可以进行特殊的判断
  2. 只要是Exception,就可以被try/catch捕获得到,包括RuntimeException

首先说明第一点,什么是特殊判断?就是说我们用if/else语句判断不了。

举个例子,FingerprintManager这个类,是在API23中引入,用来操作手机指纹模块的,那么在API22及一下的平台,是不存在这个类的。但是,国内某些厂商,将指纹模块引入到API22以下的平台中,并且移植了官方的这些类,也就是说在某些国产Rom(如MIUI)中API22及以下是可能存在FingerprintManager这个类的,并且是可以操作指纹模块的。这样就导致了,我们需要判断Rom中是否存在这个类了。怎么判断,当然不能用if/else语句。

做法很简单,直接进行反射,而反射时如果没有这个类,会抛出ClassNotFoundException,代码如下:

         try {
Class.forName("android.hardware.fingerprint.FingerprintManager");
} catch (ClassNotFoundException e) {
e.printStackTrace();
Log.d(TAG, "doSomething: 没有该api");
}

接着是第二点,RuntimeException是可以被捕获的。

因为RuntimeException不是由throw来抛出,所以IDE不会引导我们使用try/catch来捕获这个异常,而实际上,我们可以自己进行添加。

例子:在Android开发中,假设要对某个View设置背景颜色,我们可以调用setBackgroundColor方法来进行设置,这个方法传入一个int作为参数。实际上这个int代表的是一个颜色的ARGB值,如白色0xFFFFFFFF。假设需要编写一个方法,设置一个View的背景颜色,传入一个参数表示颜色的值或者是颜色的id(R.color.xxx),方法名:

private void setViewBackground(View view, int color)

要怎么写?

首先,不能通过重载,因为颜色的值和id都是一个int,参数类型相同,就不能重载,多增加一个参数又显得多余。

这个时候,就可以通过异常的捕获来做到:

     private void setViewBackground(View view, int color) {
try {
view.setBackgroundColor(ContextCompat.getColor(this, color));
} catch (Resources.NotFoundException e) {
e.printStackTrace();
view.setBackgroundColor(color);
}
}

可以看到,我们直接将这个int作为一个id来使用,通过ContextCompat的getColor来获取id对应的颜色值,这个时候,假设传入的直接就是一个颜色,那么在资源文件R中,是找不到这个id的,这样会抛出一个RuntimeException,就是上面给出的Resources.NotFoundException,如果捕获到异常,就正面这个参数不是id,直接设置给View即可。

当然,这个方法也不是都正确,因为有可能传入的颜色值刚好与某个颜色的id一样,那么就会出现得不到想要颜色的问题。这个例子,只是说明RuntimeException可以被我们处理,即使IDE不提示。

Android开发学习之路-关于Exception的更多相关文章

  1. Android开发学习之路--网络编程之xml、json

    一般网络数据通过http来get,post,那么其中的数据不可能杂乱无章,比如我要post一段数据,肯定是要有一定的格式,协议的.常用的就是xml和json了.在此先要搭建个简单的服务器吧,首先呢下载 ...

  2. Android开发学习之路-RecyclerView滑动删除和拖动排序

    Android开发学习之路-RecyclerView使用初探 Android开发学习之路-RecyclerView的Item自定义动画及DefaultItemAnimator源码分析 Android开 ...

  3. Android开发学习之路--基于vitamio的视频播放器(二)

      终于把该忙的事情都忙得差不多了,接下来又可以开始good good study,day day up了.在Android开发学习之路–基于vitamio的视频播放器(一)中,主要讲了播放器的界面的 ...

  4. Android开发学习之路--Android Studio cmake编译ffmpeg

      最新的android studio2.2引入了cmake可以很好地实现ndk的编写.这里使用最新的方式,对于以前的android下的ndk编译什么的可以参考之前的文章:Android开发学习之路– ...

  5. Android开发学习之路--Activity之初体验

    环境也搭建好了,android系统也基本了解了,那么接下来就可以开始学习android开发了,相信这么学下去肯定可以把android开发学习好的,再加上时而再温故下linux下的知识,看看androi ...

  6. Android开发学习之路--Android系统架构初探

    环境搭建好了,最简单的app也运行过了,那么app到底是怎么运行在手机上的,手机又到底怎么能运行这些应用,一堆的电子元器件最后可以运行这么美妙的界面,在此还是需要好好研究研究.这里从芯片及硬件模块-& ...

  7. Android开发学习之路--MAC下Android Studio开发环境搭建

    自从毕业开始到现在还没有系统地学习android应用的开发,之前一直都是做些底层的驱动,以及linux上的c开发.虽然写过几个简单的app,也对android4.0.3的源代码做过部分的分析,也算入门 ...

  8. Android开发学习之路--数据持久化之初体验

    上班第一天,虽然工作上处于酱油模式,但是学习上依旧不能拉下,接着学习android开发吧,这里学习数据持久化的 知识. 其实数据持久化就是数据可以保存起来,一般我们保存数据都是以文件,或者数据库的形式 ...

  9. Android开发学习之路-记一次CSDN公开课

    今天的CSDN公开课Android事件处理重难点快速掌握中老师讲到一个概念我觉得不正确. 原话是这样的:点击事件可以通过事件监听和回调两种方法实现. 我一听到之后我的表情是这样的: 这跟我学的看的都不 ...

随机推荐

  1. javascript动画系列第三篇——碰撞检测

    前面的话 前面分别介绍了拖拽模拟和磁性吸附,当可视区域内存在多个可拖拽元素,就出现碰撞检测的问题,这也是javascript动画的一个经典问题.本篇将详细介绍碰撞检测 原理介绍 碰撞检测的方法有很多, ...

  2. Git 在团队中的最佳实践--如何正确使用Git Flow

    我们已经从SVN 切换到Git很多年了,现在几乎所有的项目都在使用Github管理, 本篇文章讲一下为什么使用Git, 以及如何在团队中正确使用. Git的优点 Git的优点很多,但是这里只列出我认为 ...

  3. 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)

    一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...

  4. Android性能优化之利用Rxlifecycle解决RxJava内存泄漏

    前言: 其实RxJava引起的内存泄漏是我无意中发现了,本来是想了解Retrofit与RxJava相结合中是如何通过适配器模式解决的,结果却发现了RxJava是会引起内存泄漏的,所有想着查找一下资料学 ...

  5. jQuery之Deferred源码剖析

    一.前言 大约在夏季,我们谈过ES6的Promise(详见here),其实在ES6前jQuery早就有了Promise,也就是我们所知道的Deferred对象,宗旨当然也和ES6的Promise一样, ...

  6. Spark踩坑记——初试

    [TOC] Spark简介 整体认识 Apache Spark是一个围绕速度.易用性和复杂分析构建的大数据处理框架.最初在2009年由加州大学伯克利分校的AMPLab开发,并于2010年成为Apach ...

  7. .Net Core上用于代替System.Drawing的类库

    目前.Net Core上没有System.Drawing这个类库,想要在.Net Core上处理图片得另辟蹊径. 微软给出了将来取代System.Drawing的方案,偏向于使用一个单独的服务端进行各 ...

  8. 【云知道】LoadRunner 录制问题集锦

    关键词:各路录制小白汇集于此 虽然知道君对录制不感冒,但总是看到扎堆的人说这些问题,忍不住要站出来了. 百度虽好,帮助了很多小白,但关键是百度并没有排除错误内容,经过历史的几年传播,错的都快变对的了, ...

  9. pt-heartbeat

    pt-heartbeat是用来监测主从延迟的情况的,众所周知,传统的通过show slave status\G命令中的Seconds_Behind_Master值来判断主从延迟并不靠谱. pt-hea ...

  10. android手机登录时遇到“QQ安全登录发现病毒”解决

    android手机作为开源系统非常容易感染病毒,有时候我们会经常遇到手机QQ登录时检测到app被感染,一般情况是由手机感染病毒所引起的,安装腾讯管家后只能检测病毒和卸载感染病毒的软件,不能清除病毒.解 ...