zoukankan      html  css  js  c++  java
  • Android开发学习之路-关于Exception

    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,代码如下:

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

    接着是第二点,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,参数类型相同,就不能重载,多增加一个参数又显得多余。

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

    1     private void setViewBackground(View view, int color) {
    2         try {
    3             view.setBackgroundColor(ContextCompat.getColor(this, color));
    4         } catch (Resources.NotFoundException e) {
    5             e.printStackTrace();
    6             view.setBackgroundColor(color);
    7         }
    8     }

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

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

  • 相关阅读:
    Oracle/PLSQL: RTRIM Function-from cyber
    Oracle/PLSQL: LTRIM Function-from cyber
    Oracle AnyData Data Type Version 11.1-from cyber
    用 Sqlplus 创建用户的详细步骤 (centos 6.0,Oracle 11g)
    SQL_Plus操作命令-引自网络
    Linux下scp的用法-引自网络
    非学习型单层感知机的java实现(日志三)
    N维法向量与N维超平面的关系的简单证明(日志二)
    R语言分析(二)——薛毅R语言第二章后面习题解析
    R语言分析(一)-----基本语法
  • 原文地址:https://www.cnblogs.com/Fndroid/p/5973763.html
Copyright © 2011-2022 走看看