浅谈 Android Exception & Throwable 类

Java 异常及处理|Error、Throwable、Exception 阅读详情

一、Throwable 类

概述:java将所有的错误封装为一个对象,其根本父类为Throwable, Throwable有两个子类:Error和Exception。

Error: 这种异常被设计成不被捕获,因为这种异常产生于JVM自身。
Runtime Exception: 运行时异常往往与环境有关,编译时无法检查,并且可能发生的情况太广泛,所以系统会去处理,程序不需要捕获。 

注意:异常和错误的区别:异常能被程序本身可以处理,错误是无法处理。

二、异常 类

Exception是Throwable的一个主要子类。Exception下面还有子类,其中一部分子类分别对应于Java程序运行时常常遇到的各种异常的处理,其中包括隐式异常。比如,程序中除数为0引起的错误、数组下标越界错误等,这类异常也称为运行时异常RumtimeException,因为它们虽然是由程序本身引起的异常,但不是程序主动抛出的,而是在程序运行中产生的。Exception子类下面的另一部分子类对应于Java程序中的非运行时异常的处理,这些异常也称为显式异常非RumtimeException。它们都是在程序中用语句抛出、并且也是用语句进行捕获的,比如,文件没找到引起的异常、类没找到引起的异常等。

  •  异常分类
Exception 这种异常分两大类运行时异常和非运行时异常(编译异常)。程序中应当尽可能去处理这些异常。

       运行时异常:都是RuntimeException类及其子类异常,如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。

      运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。
       非运行时异常 (编译异常):是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。

问题:内存溢出不能捕获的原因:
首先,你得明白,内存溢出不是异常,是Error,Java中的异常分为受查异常和不受查异常。不受查异常时无法获取之后用程序处理的。OutOfMemory是不受查异常,它是由于java虚拟机运行时无法再分配到内存引起的,这时java虚拟机已经无法正常工作了,只能停止,所以就不能再捕获

三、异常的捕获方法——你是否面试躺枪过,老铁?

try 块:用于捕获异常。其后可接零个或多个catch块,如果没有catch块,则必须跟一个finally块。
catch 块:用于处理try捕获到的异常。
finally 块:无论是否捕获或处理异常,finally块里的语句都会被执行。当在try块或catch块中遇到return语句时,finally语句块将在方法返回之前被执行。在以下4种特殊情况下,finally块不会被执行:
1、在finally语句块中发生了异常。
2、在前面的代码中用了System.exit()退出程序。
3、程序所在的线程死亡。
4、关闭CPU。

面试题: try、catch、finally语句块的执行顺序

1、当try没有捕获到异常时:try语句块中的语句逐一被执行,程序将跳过catch语句块,执行finally语句块和其后的语句;

2、当try捕获到异常,catch语句块里没有处理此异常的情况:当try语句块里的某条语句出现异常时,而没有处理此异常的catch语句块时,此异常将会抛给JVM处理,finally语句块里的语句还是会被执行,但finally语句块后的语句不会被执行;

3、当try捕获到异常,catch语句块里有处理此异常的情况:在try语句块中是按照顺序来执行的,当执行到某一条语句出现异常时,程序将跳到catch语句块,并与catch语句块逐一匹配,找到与之对应的处理程序,其他的catch语句块将不会被执行,而try语句块中,出现异常之后的语句也不会被执行,catch语句块执行完后,执行finally语句块里的语句,最后执行finally语句块后的语句;

try语句中的代码越少越好。在多个catch语句中,需要将父异常放在最后面,否则将不会执行具体异常。异常1、异常2都是平级关系的异常,若含有字符关系将报错。

  • 异常处理的方式 一  捕获异常
try{}...catch(异常类名 变量名){}

try{}...catch(异常类名 变量名){}...catch(异常类名 变量名){}

try{}...catch(异常类名 变量名){}...catch(异常类名 变量名){}...finally{}

try{}...finally{}
  •  异常处理的方式 二  声明异常

      声明异常:在方法的大括号前用throws 异常类名

      当在写方法时,如果觉得会出现异常,且自己没有解决或者想让调用者自己解决时,可以在方法的大括号前用throws异常类         名,将可能会发生的异常声明出去。

public static int method(int a, int b) throws Exception {
	int c = a / b;
	return c;
}
  •   异常处理的方式 三  抛出异常

       抛出异常:是在方法中用 throw 异常对象 

public static int method(int a, int b) {
	if (b==0) {
		throw new ArithmeticException();
	}
	int c = a / b;
	return c;
}

 

  •   异常处理的方式 三   自定义异常

       1、如何自定义一个异常类?

       让自定义类继承RuntimeException 或者继承Exception

       注意:编译时期异常(非RuntimeException),如果在方法内部用throw抛出了一个异常对象那么在方法声明上必须用throws关键        字声明异常,运行时期异常就不需要这样。

public class MyException extends Exception {
	public MyException(String message) {
		super(message);
	}
}

 更多异常处理面试题 可参阅:https://blog.youkuaiyun.com/lgm_hakka/article/details/47438897

 四、常见异常和解决方法

runtimeException子类:

1 .java.lang.NullPointerException

2. java.lang.IllegalArgumentException: n must be positive

3.集合变化 java.util.ConcurrentModificationException, Caused by: java.lang.ArrayIndexOutOfBoundsException

4.动画里面的算术 java.lang.NumberFormatException: Invalid double: "" java.lang.ArithmeticException: divide by zero

5.java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState

奇葩的问题:

1.图片。类,找不到,混淆问题:android.content.res.Resources$NotFoundException: File res/drawable-xhdpi-v4/abnormal_purple_beg.png from drawable resource ID #0x7f020008

2.没有方法,可能是API低版本的不支持,java.lang.NoSuchMethodError

3.java.util.concurrent.TimeoutException:

4.java.lang.SecurityException: Not allowed to start activity Intent

5.Caused by: android.os.DeadObjectException: Transaction failed on small parcel; remote process probably died 

6.java.lang.RuntimeException: Could not read input channel file descriptors from parcel.

IOException

1.数据库的IO异常   android.database.sqlite.SQLiteDiskIOException:

2.文件没有找到

Error:

Error:内存溢出:java.lang.OutOfMemoryError: Failed to allocate a 1868981625 byte allocation with 991781 free bytes and 509MB until OOM

五、奔溃日志上报  

全局捕获异常并上报:比如第三方的友盟、蒲公英等,腾讯Bugly、听云

UncaughtExceptionHandler:在程序异常的时候,默认是把进程杀死,有们自己先上报然后手动再杀死进程!

在Android开发中,常常会出现uncheched Exception 导致程序的crash,为了提供良好的用户体验,并对出错的信息进行收集,以便对程序进行改进,提高程序的健壮性。

因此,常使用Thread.UncaughtExceptionHandler来进行处理。

/**
 * 奔溃日志收集类
 */
public class CrashHandler implements Thread.UncaughtExceptionHandler {

    //系统默认的UncaughtException处理类
    private Thread.UncaughtExceptionHandler mDefaultHandler;
    //CrashHandler实例
    private static CrashHandler instance = new CrashHandler();
    //程序的Context对象
    private Context mContext;
    private static final String TAG=CrashHandler.class.getSimpleName();
    /** 崩溃应用包名KEY */
    private final String KEY_PKG = "key_pkg";
    /** APP版本号KEY */
    private final String KEY_VER = "key_ver";
    /** APP渠道号KEY */
    private final String KEY_CXHZCHANNEL = "key_cxhzchannel";
    /** 厂商 */
    private final String KEY_BRAND = "key_brand";
    /** 机型 */
    private final String KEY_MODEL = "key_model";
    /** 系统版本KEY */
    private final String KEY_OS_VER = "key_os_ver";
    /** 崩溃时间KEY */
    private final String KEY_TIME = "key_time";
    //用来存储设备信息和异常信息 系统崩溃日志
    private Map<String, String> infos;
    //用于格式化日期,作为日志文件名的一部分
    private DateFormat formatter;

    /** 保证只有一个CrashHandler实例 */
    private CrashHandler() {
        infos = new HashMap<String, String>();
        formatter = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss", Locale.CHINA);
    }

    /** 获取CrashHandler实例 ,单例模式 */
    public static CrashHandler getInstance() {
        return instance;
    }

    /**
     * 初始化
     * @param context
     */
    public void init(final Context context) {
        mContext = context;
        //获取系统默认的UncaughtException处理器
        mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
        //设置该CrashHandler为程序的默认处理器
        Thread.setDefaultUncaughtExceptionHandler(this);
        new Thread(new Runnable() {
            @Override
            public void run() {
                String pkg = CXPackageManagerUtil.getCurProcessName(context);
                for(int i=0;i<3;i++){
                    if(pkg.contains(context.getPackageName())){
                        try {
                            Thread.sleep(1000);
                        }catch (Exception e){
                            e.printStackTrace();
                        }
                        pkg = CXPackageManagerUtil.getCurProcessName(context);
                    }else{
                        break;
                    }
                }
                infos.put(KEY_PKG, pkg);
                if(pkg.contains(context.getPackageName())){
                    infos.put(KEY_VER, String.valueOf(CXPackageManagerUtil.getPackageVersionCode(context)));
                    infos.put(KEY_CXHZCHANNEL, CXPackageManagerUtil.getChannel(context));
                }else{
                    infos.put(KEY_VER, String.valueOf(CXPackageManagerUtil.getVersionCode(mContext, mContext.getPackageName())));
                    infos.put(KEY_CXHZCHANNEL, "");
                }
                infos.put(KEY_BRAND, Build.BRAND);
                infos.put(KEY_MODEL, Build.MODEL);
                infos.put(KEY_OS_VER, Build.VERSION.RELEASE);
                CXLog.i(TAG, infos.toString());
            }
        }).start();
    }

    /**
     * 初始化数据
     * @param pkg
     */
    public void init(String pkg){
        if(pkg != null){
            infos.put(KEY_PKG, pkg);
            infos.put(KEY_VER, String.valueOf(CXPackageManagerUtil.getVersionCode(mContext, mContext.getPackageName())));
            infos.put(KEY_CXHZCHANNEL, CXPackageManagerUtil.getChannel(mContext));
            infos.put(KEY_BRAND, Build.BRAND);
            infos.put(KEY_MODEL, Build.MODEL);
            infos.put(KEY_OS_VER, Build.VERSION.RELEASE);
            CXLog.i(TAG, infos.toString());
        }
    }

    /**
     * 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成.
     *
     * @param ex
     * @return true:如果处理了该异常信息;否则返回false.
     */
    private boolean handleException(Throwable ex) {
        boolean handled = false;
        if(ex != null){
            // 上传奔溃日志
            postCrash(getCrashInfo(ex));
            // 保存奔溃日志
            CXLog.e(TAG, infos.toString());
            CXLog.e(TAG, getCrashInfo(ex));
//            writeCrashInfo(ex);
            //使用Toast来显示异常信息
            if(infos.get(KEY_PKG).equals(mContext.getPackageName())){
                new Thread() {
                    @Override
                    public void run() {
                        Looper.prepare();
                        Toast.makeText(mContext, "程序发生异常,正在退出……", Toast.LENGTH_LONG).show();
                        Looper.loop();
                    }
                }.start();
            }
            handled = true;
        }
        return handled;
    }

博文撰写主要参阅:

https://blog.youkuaiyun.com/whb20081815/article/details/76269590

https://blog.youkuaiyun.com/lgm_hakka/article/details/47438897

尊重原创,感谢以上我参阅的两篇博文,此篇博文只为巩固基础知识,特此记录下,如果你觉得本篇博客对你有用,就留个言或者顶一下吧(^-^)!

Android 性能优化(三)认识错误Error和异常Exception及栈轨迹StackTrace 前言 Android 性能优化之内存检测、卡顿优化、耗电优化、APK瘦身,这篇中我强调“运行稳定大于一切”,保证程序运行中不出现Crash,要比卡顿、耗电、安装包大小等方面更为重要。 造成Crash的原因有很多,而在程序运行过程中抛出了异常或错误就是其中最普遍的成因。本篇将对Exception和error有一个比较全面的认识。(当然,有不足之处,请多多包涵) 一、定义 th... 阅读详情

相关推荐

异常处理系列教材 (四)- java Throwable接口

Throwable是类,Exception和Error都继承了该类。所以在捕捉的时候,也可以使用Throwable进行捕捉。Exception里又分。

MAGIC_LAN的博客 311

Android Exception&Throwable 常见异常和解决方法 奔溃日志上报 monkey异常修改

java将所有的错误封装为一个对象,其根本父类为Throwable, Throwable有两个子类:Error和Exception。 注意:异常和错误的区别:异常能被程序本身可以处理,错误是无法处理。 Error: 这种异常被设计成不被捕获,因为这种异常产生于JVM自身。Runtime Exception: 运行时异常往往与环境有关,编译时无法检查,

深南大盗的博客 6852

第021篇 异常体系 Throwable:Checked 与 Unchecked 的边界

Android 面试里有一类题专门筛人,异常体系 Throwable 的原理追问就是典型:第一层问"Error 和 Exception 什么关系",第二层问"受检和非受检到底怎么分",第三层问"为什么 finally 保证执行、catch 吞异常有什么后果"。三层下来,背题的和理解的立刻分层。能随手画出那张继承树的人,八成是把异常处理用过、踩过、复盘过的。先把结论放在前面:Throwable 下分 Error 与 Exception,Error 代表虚拟机层面不可恢复的问题(如 OOM),应用不应捕获;

郑伟强dev的专栏 25

Android:java 抛出异常throw与throws以及捕捉异常try、catch、finally学习

Android:java 抛出异常throw与throws以及捕捉异常try、catch、finally学习 一、异常处理机制 异常处理是对可能出现的异常进行处理,以防止程序遇到异常时被卡死,处于一直等待,或死循环。异常有两个过程,一个是抛出异常;一个是捕捉异常。 二、培养好的编程习惯 1.在写程序时,对可能会出现异常的部分通常要用try{...}catch{...

海月汐辰 1万+

Android自定义抛出异常的方法详解

前言 在android开发过程中,我们经常遇到异常的问题,崩溃抛出异常的时候,是非常令人烦闷的。但是异常有一个好处,使得app能在编译的时候给我们提供一些bug信息,有时可能比较模糊,有时可能很精准,甚至提示报错行。基于这一点,今天我们就来讲讲android中的异常吧。 今天要讲的内容: throw 和 throws 异常类型 仿写异常及其好处 一. throw 和 throws 异常通常的处理方式有 throw/throws 以及 try-catch 两种。今天我们主要讲解throw/throws这一类的处理。 throw:抛出异常,一般是一个具体的异常。放置在方法体内

Unity地形优化实战:LOD、合批与HLOD打造流畅开放世界

在计算机图形学与游戏开发中,渲染优化是保障应用流畅运行的核心技术。其基本原理在于通过算法与策略,在视觉保真度与硬件资源消耗之间寻求最佳平衡,旨在提升帧率、降低功耗。这一技术的核心价值在于,它直接决定了大规模场景(如开放世界游戏)在性能受限平台(尤其是移动设备)上的可行性。具体到地形渲染这一关键应用场景,开发者需要综合运用多层次细节(LOD)技术来动态调整模型精度,并通过Draw Call合批(Batching)与GPU实例化(GPU Instancing)来大幅减少CPU到GPU的通信开销。对于超大规模世界

weixin_28077113的博客 333

throwable和Exception的区别

throwable和exception的区别: 1、throwable是父类,exception是子类。 2、throwable是根基,exception是从throwable派生出来的。 3、throwable中包括exception(异常)和error(错误)。 4、throwable用来定义所有可以作为异常被抛出来的类,exception专指程序本身可以处理的异常,一般性的异常。 ...

月光秦城 1万+

Cadence DSP 算子开发实战:从入门到精通

本文详细介绍了Cadence DSP算子开发的实战技巧,从入门基础到高级优化。内容涵盖DSP架构特性、内存管理、分块计算策略、SIMD指令优化等核心知识,并提供了性能调优和调试的实用技巧,帮助开发者快速掌握Cadence DSP开发精髓,提升图像处理等计算密集型任务的开发效率。

weixin_29278805的博客 435

详解Throwable类,精心制作

详解Throwable类,精心制作

dear_Alice_moon的专栏 991

面试题-手撕NMS(非极大值抑制)

非极大值抑制(Non-Maximum Suppression,NMS)是一种常用于目标检测和计算机视觉中的算法,用于去除重叠的边界框,保留最可能是真实目标的边界框。其核心就是对一组检测框,找出其中属于同一个类别且分数最高的那个框,然后把和这个框的IOU值大于阈值的那些框都删掉。

zhaoyqcsdn的博客 1109

Intel RealSense D435深度相机实战:从数据采集到点云生成的完整避坑指南

本文详细介绍了Intel RealSense D435深度相机的实战应用,从数据采集到点云生成的完整流程,并提供了避坑指南。内容包括环境配置、硬件调优、数据采集技巧、点云生成核心技术及典型场景解决方案,帮助开发者高效利用D435进行机器人导航、三维重建等应用。

weixin_29054195的博客 472

【Android】Throwable、Exception、Error的关系

https://blog.youkuaiyun.com/hl_java/article/details/76837141?locationNum=4&amp;fps=1

Hmy的博客 653

[记录一个bug]av_hwdevice_ctx_create出现Cannot allocate memory(附带库运行时路径)[已解决]

新写的程序里调用ffmpeg的av_hwdevice_ctx_create()这个函数,出现Cannot allocate memory。但是另个程序一样的代码,居然是成功的。 反复检查之后无果,就跳出去查了一下,看到一个问答: Have you tried to use ffmpg executables with the same libs that you using when you run the app? Have you tried to use ffmpg executables

熊猫Ben的博客 3586

如何处理异常? catch Exception OR catch Throwable

为什么80%的码农都做不了架构师?&gt;&gt;&gt; ...

weixin_34115824的博客 529

Truncated SVD for faster dection

Truncated SVD方法最先被提出在《Fast R-CNN》论文中,用于降低全连接层的运算量,提升模型的速度。在卷积神经网络的分类任务中,FC层的运算速度远远大于CONV层,而在Fast R-CNN的目标检测任务中,大多数的运算时间发生在FC 的运算中,是因为针对每张输入图片,只进行一次卷积操作,而要对生成的Region Proposal,大致两千个,进行全连接操作进行分类与Bounding...

weixin_35747666的博客 1535

DaVinciCFG实战:从ARXML配置到ADC代码生成全解析

本文详细解析了使用DaVinciCFG工具进行ADC模块配置的全过程,从ARXML文件处理到代码生成与集成。重点介绍了关键参数配置、ARXML语法规则、常见错误排查及代码优化技巧,帮助开发者掌握AUTOSAR架构下ADC驱动开发,提升汽车电子系统的可靠性。

f9g0h的博客 379

JDK1.8源码学习--lang包(Throwable,Error,Exception)

前言 月是一轮明镜,晶莹剔透,代表着一张白纸(啥也不懂) 央是一片海洋,海乃百川,代表着一块海绵(吸纳万物) 泽是一柄利剑,千锤百炼,代表着千百锤炼(输入输出) 月央泽,学习的一种过程,从白纸-&gt;吸收各种知识-&gt;不断输入输出变成自己的内容 希望大家一起坚持这个过程,也同样希望大家最终都能从零到零,把知识从薄变厚,再由厚变薄! ...

w5_Silence的博客 570

6.3 节深度拆解:Hermes Agent 多 Agent 协同执行链路的 4 层设计逻辑

拆解 Hermes 多 Agent 协同的 4 层工程化设计(协议层、编排层、执行层、适配层),聚焦协议层的强约束消息 Schema 如何解决 Agent 间语义不一致问题,并提供 `soul.md` 配置、GLM-4.7Flash 结构化输出验证及 v0.13.0/v0.14.0 版本实操避坑指南

weixin_42520239的博客 122

android exception异常代码,【Android开发】Java 异常 Exception

前言: Java 中 Exception 继承自Throwable。在程序的编译、运行过程中,JVM检测、捕获这些异常,保证程序运行的健壮性。Exception 分类Exception 总共有两大类:Unchecked Exception(Runtime Exception)Checked Exception(非Runtime Exception)提醒:所有的RuntimeException都是U...

weixin_26884391的博客 555

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

java.lang.Throwable

package java.lang;import  java.io.*;/** *  * Throwable是所有Error和Exceptiong的父类 * 注意它有四个构造函数: * Throwable() * Throwable(String message) * Throwable(Throwable cause) * Throwable(String message, Throwabl

3298

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

JAVA当中Error和Exception的区别浅谈

JAVA当中Error和Exception的区别浅谈

Think Different 532

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Throwable中的toString方法

这样调用toString,会直接调用默认父类Object中的toString。所以必需让类继承Throwable或Exception,让Throwable中的toString覆盖Object中的toString。 Throwable中的toString伪代码

学习笔记 1373

Java异常处理:catch里写Throwable和Exception有什么区别?

在Java开发中,异常处理是保证程序健壮性的关键环节。很多开发者习惯使用try catch捕获异常,但对catch参数类型的选择往往不够严谨。理解Throwable、Exception与Error的继承关系,是掌握异常处理机制的基础。从JVM字节码层面的异常表匹配逻辑来看,catch (Throwable) 会捕获包括OutOfMemoryError在内的严重错误,容易掩盖致命问题,导致系统带病运行。而catch (Exception) 更适合作为业务代码的兜底方案,符合阿里Java开发手册规范。在实际工程

weixin_34408624的博客 295

java异常Throwable类及异常处理

异常Throwable类: 子类1-Error:错误            与代码无关,无法处理。如:服务器宕机、数据库崩溃 子类2-Exception:异常            常说的异常,与代码有关,需要处理。 2-a-编译期(java.exe 将.java编译成.class字节码文件)异常: 写代码时标红的错误,必须处理才能通过编译 2-b-运行时(执行.class字节码文件...

渡安H的博客 684

JAVA会将所有的错误封装成为一个对象,其根本父类为Throwable

Throwable有两个子类:Error和Exception。 一个Error对象表示一个程序错误,指的是底层的、低级的、不可恢复的严重错误。此时程序一定会退出,因为已经失去了运行所必须的物理环境。 对于Error错误我们无法进行处理,因为我们是通过程序来应对错误,可是程序已经退出了。 我们可以处理的Throwable对象中只有Exception对象(例外/异常)。 Exception有两...

草原印象的博客 286
上一篇: Android 架构组件——LiveData 探究与使用
下一篇: Android 常见分辨率 —— mdpi、hdpi 、xhdpi、xxhdpi
LXB-89
博客等级 码龄11年 34粉丝 81原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值