前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Exception 和 Error 有什么区别么声明提问正文

Exception 和 Error 有什么区别么声明提问正文

作者头像
请叫我大苏
发布于 2018-07-05 02:32:58
发布于 2018-07-05 02:32:58
81900
代码可运行
举报
文章被收录于专栏:AndroidTvAndroidTv
运行总次数:0
代码可运行

提问

  • Exception 和 Error 有什么区别?
  • 运行时异常和一般异常有什么区别?
  • 你了解哪些常见的 Error,Exception,RuntimeException?
  • NoClassDefFoundError 和 ClassNotFoundException 有什么区别?
  • 异常处理的代码有哪些比较良好的规范?

正文

对于这个问题,感觉我讲不了很多,顶多都是一些概念性回答而已。

Exception

Exception 是程序正常运行时,可以预料到的意外情况,可以被捕获,也应该进行相应异常处理。

Exception 继承自 Throwable,具体又可划分为 RuntimeException 运行时异常和一般异常。两者的区别在于运行时异常在编译阶段可以不用进行捕获,这类异常通常都是在 Lint 检查过程中,或者程序运行期间才暴露出来的异常,因此也可以被归类为非检查型异常。

一般异常则是在编译期间就必须进行异常捕获,因此也被归类为检查型异常。

Error

Error 也是继承自 Throwable,同样会造成程序崩溃退出,但跟异常不大一样的是,这类错误问题,通常是由于 JVM 运行状态出了问题导致,我们不应捕获处理。要做的,应该是分析该错误出现的原因,尽量避免这类问题的出现。

关于 Exception 和 Error 的区别,可以简单这么理解,我们可以从异常中恢复程序但却不应该尝试从错误中恢复程序。

以上,基本就是我对于该讲问题所能想到的最大限度的点了。看了该讲作者所扩展的点,以及评论区里大神的回复,其实还可以从常见的一些异常,即原因和处理方式扩展;也可以从异常处理代码的规范角度出发扩展讲一讲,我都统一将这些扩展都在开头的提问中列出来了。

常见的 Exception 或 Error

想查阅相关的 Exception 或 Error,如果你记得该异常的名称,那可以直接通过 Android Stduio 查阅相关源码即可。

如果想翻看所有的类别,那么也可通过 AS 的 Hierarchy 功能查阅,快捷键 Ctrl + H,如下:

asHierarchy.png

在这里翻看、过滤你熟悉的,或者想找的异常或错误,点进去查看相关源码说明即可。

至于常见的 Exception,RuntiomeException,Error,我针对个人在项目中较常遇见,目前印象较深的画了张类图:

常见异常和错误.png

  • ActivityNotFoundException

源码注释里说了,该异常是当调用了 startActivity() 之后,找不到匹配的 Activity 时抛出该异常。也就是说,通常通过隐式 Intent 打开 Activity,或者通过广播,URI 等方式,不注意一点的话,可能会出现该异常。

如果有使用到这些场景,可以考虑是否增加异常捕获,防止使用不当造成异常。

  • BadTokenException

这里的异常指的是 WindowManager 内部类 BadTokenException,显然,当添加一个新的 window 时,如果 LayoutParams 不合法,就会抛出该异常。

添加 window 的场景,除了手动通过 WindowManager 的 addView() 的场景外,其实打开一个新的 Activity,新的 Dialog,内部也是通过 WindowManager 来 addView() 的,因此,这些场景下都是有可能发生该异常的。

不过,这个异常的日志会比较详细,因为在 ViewRootImpl 的 setView() 中,会去细分参数不合法的类别,附上部分源码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//ViewRootImpl#setView()
 
public void setView(View view, WindowManager.LayoutParams attrs, View panelParentView) {
    switch (res) {
            case WindowManagerGlobal.ADD_BAD_APP_TOKEN:
            case WindowManagerGlobal.ADD_BAD_SUBWINDOW_TOKEN:
                throw new WindowManager.BadTokenException(
                        "Unable to add window -- token " + attrs.token
                                + " is not valid; is your activity running?");
            case WindowManagerGlobal.ADD_NOT_APP_TOKEN:
                throw new WindowManager.BadTokenException(
                        "Unable to add window -- token " + attrs.token
                                + " is not for an application");
            case WindowManagerGlobal.ADD_APP_EXITING:
                throw new WindowManager.BadTokenException(
                        "Unable to add window -- app for token " + attrs.token
                                + " is exiting");
            case WindowManagerGlobal.ADD_DUPLICATE_ADD:
                throw new WindowManager.BadTokenException(
                        "Unable to add window -- window " + mWindow
                                + " has already been added");
            case WindowManagerGlobal.ADD_STARTING_NOT_NEEDED:
                // Silently ignore -- we would have just removed it
                // right away, anyway.
                return;
            case WindowManagerGlobal.ADD_MULTIPLE_SINGLETON:
                throw new WindowManager.BadTokenException("Unable to add window "
                        + mWindow + " -- another window of type "
                        + mWindowAttributes.type + " already exists");
            case WindowManagerGlobal.ADD_PERMISSION_DENIED:
                throw new WindowManager.BadTokenException("Unable to add window "
                        + mWindow + " -- permission denied for window type "
                        + mWindowAttributes.type);
}
  • ClassCastException

父类可以通过强制类型转换成具体某个子类,但如果强转的两个类之间不存在继承关系,那么就会抛出该异常。

如果不确定需要强转的两个类的关系,可以先通过关键字 instanceof 进行判断。

  • ConcurrentModificationException

这异常则是由于一些不恰当的集合操作导致,比如遍历集合的过程中,进行了不恰当的删除操作;或者有某个线程正在遍历集合,另外一个线程则对该集合进行的修改操作;

相对应的避免方法网上也很多,比如遍历集合删除的操作通过迭代器来实现等等。

  • IndexOutOfBoundsException

数组越界异常,这类异常还蛮经常出现的,避免方式就只能是尽量书写规范的代码,注意一些,或者多让程序跑跑 Lint 检查。

  • NullPointerException

空指针异常,这异常算是最令人头疼的异常了,在线上异常的比例中,肯定不少。

而且出现情况有时还很难分析,代码流程上查看,明明不会出现空指针场景,但现实就是有用户的的确确出现了。

解决时,如果可以,尽量不要简单的加个非空判断,在程序中各个地方加非空判断,其实是种特别不优雅的行为。如果能明确为什么会出现为空的场景,如何解决,这是最好的,而不是每次都简单的加个非空判断。

场景很多很多,之前也有写过一篇专门处理实体类的空判断文章,感兴趣的可以看看:

分享两个提高效率的AndroidStudio小技巧

  • IOException

IO 异常,属于检查型异常,必须通过 try catch 代码块捕获才能通过编译阶段,这也就没什么好介绍的了。

  • OutOfMemoryError

内存溢出错误,这类问题属于 Error,不属于 Exception,所以不要期待解决这类问题仅仅通过捕获就可以处理。

针对 Error 这类问题,我们没法捕获处理,只能是从避免的角度出发,分析出现的原因,尽量不用出现这类问题。

造成内存溢出的问题,有多种,大概就是图片问题、内存泄漏问题。

针对图片使用的优化处理,网上很多,各种压缩、降分辨率等等方式。

针对内存泄漏,一是开发期间遵守规范的代码行为,尽量避免写出有内存泄漏的隐患;二是发生内存泄漏后,借助相应工具进行定位分析。

  • StackOverflowError

这类错误很严重,表示程序陷入了死循环当中,原因也就是你写了有问题的代码。

因此,当出现这类问题,最好尽快定位处理。

  • NoClassDefFoundError

这类问题,通常出现的场景是:编译阶段没问题,但程序运行期间却出现该问题。

原因一般是由于打包时,jar 出现问题,部分类没有打包进去,导致的问题。

  • ClassNotFoundException

这个异常,同样属于相关类找不到的问题,但出现的场景通常是由于程序中使用了反射,或者动态加载之类的方式,使用了错误的类名,导致的问题。

还有可能是由于混淆导致。

异常处理良好规范
  • 尽量不要捕获类似 Exception 这样通用的异常,而是应该捕获特定异常

这是因为在日常的开发和合作中,我们读代码的机会往往超过写代码,软件工程是门协作艺术,所以我们有义务让自己的代码能够直观的体现出尽量多的信息,而泛泛的 Exception 之类,恰恰隐藏了我们的目的。另外,我们也要保证程序不会捕获到我们不希望捕获的异常。比如,你可能更希望 RuntimeException 被扩散出来,而不是被捕获。 进一步讲,除非深思熟虑了,否则不要捕获 Throwable 或者 Error,这样很难保证我们能够正确处理异常。

  • 不要生吞异常

如果我们不把异常抛出来,或者也没有输出到日志之类,程序可能在后续代码以不可控的方式结束。没人能够轻易判断究竟是哪里抛出了异常,以及是什么原因产生了异常。

  • try-catch 代码段会产生额外的性能开销

try-catch 代码段往往会影响 JVM 对代码进行优化,所以建议仅捕获有必要的代码段,尽量不要一个大的 try 包住整段的代码;与此同时,利用异常控制代码流程,也不是一个好主意,远比我们通常意义上的条件语句 (if / else, switch)要低效 Java 每实例化一个 Exception,都会对当时的栈进行快照,这是一个相对比较重的操作,如果发生的非常频繁,这个开销可就不能被忽略了。

  • 不要在 finally 代码块中处理返回值

按照我们程序员的惯性认知:当遇到 return 语句的时候,执行函数会立刻返回。但是,在 Java 语言中,如果存在 finally 就会有例外。除了 return 语句, try 代码块中的 break 或 continue 语句也可能使控制权进入 finally 代码块。 请勿在 try 代码块中调用 return, break, continue 语句。万一无法避免,一定要确保 finally 的存在不会改变函数的返回值。 函数的返回值有两种类型:值类型和对象引用,对于对象引用,要特别小心,如果在 finally 代码块中对函数返回的对象成员属性进行了修改,即使不在 finally 块中显示调用 return 语句,这个修改也会作用于返回值上。

  • 当一个 try 后跟了很多个 catch 时,必须先捕获小的异常再捕获大的异常。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.07.04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
清华大学提出APDrawingGAN:人脸照片秒变艺术肖像画,已被CVPR 2019录取
肖像画作为人物画的一种,其简约的风格以及以形写神、迁想妙得的创作方法获得了大家的喜爱。
大数据文摘
2019/06/20
1.5K0
清华大学提出APDrawingGAN:人脸照片秒变艺术肖像画,已被CVPR 2019录取
四天搞懂生成对抗网络(四)——CycleGAN的绝妙设计:双向循环生成的结构
在“风格迁移四部曲系列”的《风格迁移的“精神始祖”Conditional GAN》文章中,已经跟大伙一起在MNIST手写数据集上手撸了CGAN,让GAN学会了“认标签,写数字”。然后,我们将CGAN“拟合条件概率分布”的思想发扬光大,在文章《用CGAN做图像转换的鼻祖pix2pix》中,让GAN学会了“看图学画风”,并用学会的图片风格渲染新图片。到这里GAN是不是已经有了点艺术家的气质了~
用户1386409
2020/11/23
19.3K0
四天搞懂生成对抗网络(四)——CycleGAN的绝妙设计:双向循环生成的结构
为什么说GANs是一个绝妙的艺术创作工具?
我是一个艺术家,同时也是一位开发者。艺术和软件在我的生活中曾经是两个平行的轨道,直到我发现了GANs(Generative Adversarial Networks):在一次偶然中,我尝试用Processing和计算摄影学来生成艺术,这将我所有的艺术作品都变成了模拟量。
大数据文摘
2018/10/18
7040
GAN应用汇总
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_25737169/article/details/80874717
DoubleV
2018/09/12
1.7K0
GAN应用汇总
人脸照片秒变艺术肖像画:清华大学提出APDrawingGAN CVPR 2019 oral paper
该项工作被CVPR 2019录取为oral paper。CVPR是计算机视觉和人工智能领域内的国际顶级会议,2019共收到投稿5160篇,录取1300篇,其中oral paper288篇,仅占全部投稿的5.6%。
数据派THU
2019/06/18
1K0
人脸照片秒变艺术肖像画:清华大学提出APDrawingGAN CVPR 2019 oral paper
头像神器!照片一键秒转简笔画,清华刘永进等CVPR 19 Oral研究 | 在线可玩
清华大学和英国卡迪夫大学的研究人员提出了一种名为APDrawingGAN系统,随意输入一张人脸照片,系统输出黑白人物线条画。
量子位
2019/06/17
7.3K0
头像神器!照片一键秒转简笔画,清华刘永进等CVPR 19 Oral研究 | 在线可玩
【技术综述】人脸风格化核心技术与数据集总结
人脸图像是计算机视觉领域中研究历史最久,也是应用最广泛的图像。近几年随着研究方法的进步以及相关数据集的收集,人脸风格化成为了一个非常热门的研究领域和应用方向,本文我们来介绍其中的核心技术和相关资源。
用户1508658
2020/07/01
1.2K0
【技术综述】人脸风格化核心技术与数据集总结
那个短命的一键“脱衣”软件,我在GitHub搜到了相关技术…
文章中蓝色字体为链接,部分外部链接无法从文章中直接跳转,请点击阅读原文以访问链接。
AiTechYun
2019/08/08
24.8K0
那个短命的一键“脱衣”软件,我在GitHub搜到了相关技术…
Stable Diffusion再迎重磅更新!2.0版「涩图」功能被砍,网友狂打差评
昨天,Stability AI宣布,Stable Diffusion 2.0版本上线!
新智元
2023/01/08
3.7K1
Stable Diffusion再迎重磅更新!2.0版「涩图」功能被砍,网友狂打差评
有哪些好用的头像生成器?这5个你一定喜欢
你是否经常因为找不到适合自己的头像而苦恼,有的时候工作号需要稍微专业的头像,而个人社交媒体账号头像比如抖音头像又想要搞怪有趣点,还有设计师需要一些默认的头像占位图,总之有各种不同的需求,今天神器集整理了5个最常用到的头像生成器工具,都是免费的,分享给大家。
LOGO设计小能手
2022/12/29
1.5K0
有哪些好用的头像生成器?这5个你一定喜欢
蒙娜丽莎.gif:三星新研究用一张图像合成动图,无需3D建模
他们生成的名人头部动画包括玛丽莲·梦露、爱因斯坦、蒙娜丽莎以及 Wu Tang Clan 的 RZA 等。
机器之心
2019/05/23
7180
Midjourney|文心一格 Prompt:完整参数列表、风格汇总、文生图词典合集
https://github.com/thinkingjimmy/Learning-Prompt
汀丶人工智能
2023/05/20
1.7K0
Midjourney|文心一格 Prompt:完整参数列表、风格汇总、文生图词典合集
CycleGAN论文的阅读与翻译,无监督风格迁移、对抗损失
CycleGAN tensorflow PyTorch by LynnHo,一个简单的 TensorFlow 实现
汀丶人工智能
2023/10/11
2K0
CycleGAN论文的阅读与翻译,无监督风格迁移、对抗损失
GAN“家族”又添新成员——EditGAN,不但能自己修图,还修得比你我都好
首先想让大家猜一猜,这四张图中你觉得哪张是P过的?小编先留个悬念不公布答案,请继续往下看。
AI科技评论
2021/11/23
6960
GAN“家族”又添新成员——EditGAN,不但能自己修图,还修得比你我都好
万圣节恐怖表演、内衣检测器......2019 年二十大有趣的机器学习项目盘点
作者 | Austin Kodra 编译 | 夕颜 出品 | AI科技大本营(ID:rgznai100)
AI算法与图像处理
2019/11/07
7580
万圣节恐怖表演、内衣检测器......2019 年二十大有趣的机器学习项目盘点
生成对抗网络项目:6~9
文本到图像的合成是生成对抗网络(GAN)的用例之一,它具有许多工业应用,就像前面章节中描述的 GAN 一样。 从文本描述中合成图像非常困难,因为要构建可以生成反映文本含义的图像的模型非常困难。 一个试图解决这个问题的网络是 StackGAN。 在本章中,我们将使用 TensorFlow 作为后端在 Keras 框架中实现 StackGAN。
ApacheCN_飞龙
2023/04/24
1.3K0
本季「必追」!16个社区热议工作及10篇国际AI顶会Best Papers一文回顾
2022 年一季度的尾声,在这个季度中,你是否担忧自己错过了哪些重要的技术工作?抑或想要检验下自己是不是在这一季度又有了哪些基础知识的增长? 本篇是机器之心「虎卷er行动 · 春卷er」的第一卷,旨在为老伙计们汇总并逐一盘点2022年开春以来机器之心编辑部报道发现的社区热议的技术工作,并回顾近期举办的国际AI顶会的最佳论文。 本卷资料收录 2022春季热议工作:16项 2022春季国际顶会最佳论文:10篇 2022 春季 · 机器之心报道社区热议工作 热议工作1:阿里达摩院语音实验室提出了一种具有线性
机器之心
2022/03/14
1.1K0
绝了!分割mask生成动漫人脸!爆肝数周,从零搭建
很多小伙伴期待已久的实战项目来了,今天分享一个国外论坛medium大佬的文章,从 0 做项目的整个过程,具有很大的参考价值,大家感兴趣的可以试着参考这个思路去实现,比起直接跑别人现有的完整,一定能更有收获和成就感。
AI算法与图像处理
2022/04/06
1.1K0
绝了!分割mask生成动漫人脸!爆肝数周,从零搭建
为什么说GAN很快就要替代现有摄影技术了?
许多人当听到“人工智能”、“机器学习”或者“bot”的时候,首先浮现在脑海当中的应当是科幻片中经常出现、未来感十足的既会走路又会说话的机器人。
新智元
2019/05/08
9110
为什么说GAN很快就要替代现有摄影技术了?
【AI白身境】一文览尽计算机视觉研究方向
图像分类是计算机视觉中最基础的一个任务,也是几乎所有的基准模型进行比较的任务,从最开始比较简单的10分类的灰度图像手写数字识别mnist,到后来更大一点的10分类的cifar10和100分类的cifar100,到后来的imagenet,图像分类任务伴随着数据库的增长,一步一步提升到了今天的水平。
用户1508658
2019/07/26
8350
【AI白身境】一文览尽计算机视觉研究方向
推荐阅读
清华大学提出APDrawingGAN:人脸照片秒变艺术肖像画,已被CVPR 2019录取
1.5K0
四天搞懂生成对抗网络(四)——CycleGAN的绝妙设计:双向循环生成的结构
19.3K0
为什么说GANs是一个绝妙的艺术创作工具?
7040
GAN应用汇总
1.7K0
人脸照片秒变艺术肖像画:清华大学提出APDrawingGAN CVPR 2019 oral paper
1K0
头像神器!照片一键秒转简笔画,清华刘永进等CVPR 19 Oral研究 | 在线可玩
7.3K0
【技术综述】人脸风格化核心技术与数据集总结
1.2K0
那个短命的一键“脱衣”软件,我在GitHub搜到了相关技术…
24.8K0
Stable Diffusion再迎重磅更新!2.0版「涩图」功能被砍,网友狂打差评
3.7K1
有哪些好用的头像生成器?这5个你一定喜欢
1.5K0
蒙娜丽莎.gif:三星新研究用一张图像合成动图,无需3D建模
7180
Midjourney|文心一格 Prompt:完整参数列表、风格汇总、文生图词典合集
1.7K0
CycleGAN论文的阅读与翻译,无监督风格迁移、对抗损失
2K0
GAN“家族”又添新成员——EditGAN,不但能自己修图,还修得比你我都好
6960
万圣节恐怖表演、内衣检测器......2019 年二十大有趣的机器学习项目盘点
7580
生成对抗网络项目:6~9
1.3K0
本季「必追」!16个社区热议工作及10篇国际AI顶会Best Papers一文回顾
1.1K0
绝了!分割mask生成动漫人脸!爆肝数周,从零搭建
1.1K0
为什么说GAN很快就要替代现有摄影技术了?
9110
【AI白身境】一文览尽计算机视觉研究方向
8350
相关推荐
清华大学提出APDrawingGAN:人脸照片秒变艺术肖像画,已被CVPR 2019录取
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档