java unreported exception_Java异常处理

大家好,欢迎来到乐字节小乐的Java技术分享园地

在计算机程序运行的过程中,总是会出现各种各样的错误。

有一些错误是用户造成的,比如,希望用户输入一个int类型的年龄,但是用户的输入是abc:

// 假设用户输入了abc:String s = "abc";

int n = Integer.parseInt(s); // NumberFormatException!

程序想要读写某个文件的内容,但是用户已经把它删除了:

// 用户删除了该文件:String t = readFile("C:\\abc.txt"); // FileNotFoundException!

还有一些错误是随机出现,并且永远不可能避免的。比如:网络突然断了,连接不到远程服务器;

内存耗尽,程序崩溃了;

用户点“打印”,但根本没有打印机;

……

所以,一个健壮的程序必须处理各种各样的错误。

所谓错误,就是程序调用某个函数的时候,如果失败了,就表示出错。

调用方如何获知调用失败的信息?有两种方法:

方法一:约定返回错误码。

例如,处理一个文件,如果返回0,表示成功,返回其他整数,表示约定的错误码:

int code = processFile("C:\\test.txt");

if (code == 0) {

// ok:} else {

// error: switch (code) {

case 1:

// file not found: case 2:

// no read permission: default:

// unknown error: }

}

因为使用int类型的错误码,想要处理就非常麻烦。这种方式常见于底层C函数。

方法二:在语言层面上提供一个异常处理机制。

Java内置了一套异常处理机制,总是使用异常来表示错误。

异常是一种class,因此它本身带有类型信息。异常可以在任何地方抛出,但只需要在上层捕获,这样就和方法调用分离了:

try {

String s = processFile(“C:\\test.txt”);

// ok:} catch (FileNotFoundException e) {

// file not found:} catch (SecurityException e) {

// no read permission:} catch (IOException e) {

// io error:} catch (Exception e) {

// other error:}

因为Java的异常是class,它的继承关系如下:

┌───────────┐

│ Object │

└───────────┘

┌───────────┐

│ Throwable │

└───────────┘

┌─────────┴─────────┐

│ │

┌───────────┐ ┌───────────┐

│ Error │ │ Exception │

└───────────┘ └───────────┘

▲ ▲

┌───────┘ ┌────┴──────────┐

│ │ │

┌─────────────────┐ ┌─────────────────┐┌───────────┐

│OutOfMemoryError │... │RuntimeException ││IOException│...

└─────────────────┘ └─────────────────┘└───────────┘

┌───────────┴─────────────┐

│ │

┌─────────────────────┐ ┌─────────────────────────┐

│NullPointerException │ │IllegalArgumentException │...

└─────────────────────┘ └─────────────────────────┘

从继承关系可知:Throwable是异常体系的根,它继承自Object。Throwable有两个体系:Error和Exception,Error表示严重的错误,程序对此一般无能为力,例如:OutOfMemoryError:内存耗尽

NoClassDefFoundError:无法加载某个Class

StackOverflowError:栈溢出

而Exception则是运行时的错误,它可以被捕获并处理。

某些异常是应用程序逻辑处理的一部分,应该捕获并处理。例如:NumberFormatException:数值类型的格式错误

FileNotFoundException:未找到文件

SocketException:读取网络失败

还有一些异常是程序逻辑编写不对造成的,应该修复程序本身。例如:NullPointerException:对某个null的对象调用方法或字段

IndexOutOfBoundsException:数组索引越界

Exception又分为两大类:RuntimeException以及它的子类;

非RuntimeException(包括IOException、ReflectiveOperationException等等)

Java规定:必须捕获的异常,包括Exception及其子类,但不包括RuntimeException及其子类,这种类型的异常称为Checked Exception。

不需要捕获的异常,包括Error及其子类,RuntimeException及其子类。

捕获异常

捕获异常使用try...catch语句,把可能发生异常的代码放到try {...}中,然后使用catch捕获对应的Exception及其子类:

// try...catch

import java.io.UnsupportedEncodingException;

import java.util.Arrays;

Run

如果我们不捕获UnsupportedEncodingException,会出现编译失败的问题:

// try...catch

import java.io.UnsupportedEncodingException;

import java.util.Arrays;

Run

编译器会报错,错误信息类似:unreported exception UnsupportedEncodingException; must be caught or declared to be thrown,并且准确地指出需要捕获的语句是return s.getBytes("GBK");。意思是说,像UnsupportedEncodingException这样的Checked Exception,必须被捕获。

这是因为String.getBytes(String)方法定义是:

public byte[] getBytes(String charsetName) throws UnsupportedEncodingException {

...

}

在方法定义的时候,使用throws Xxx表示该方法可能抛出的异常类型。调用方在调用的时候,必须强制捕获这些异常,否则编译器会报错。

在toGBK()方法中,因为调用了String.getBytes(String)方法,就必须捕获UnsupportedEncodingException。我们也可以不捕获它,而是在方法定义处用throws表示toGBK()方法可能会抛出UnsupportedEncodingException,就可以让toGBK()方法通过编译器检查:

// try...catch

import java.io.UnsupportedEncodingException;

import java.util.Arrays;

Run

上述代码仍然会得到编译错误,但这一次,编译器提示的不是调用return s.getBytes("GBK");的问题,而是byte[] bs = toGBK("中文");。因为在main()方法中,调用toGBK(),没有捕获它声明的可能抛出的UnsupportedEncodingException。

修复方法是在main()方法中捕获异常并处理:

// try...catch

import java.io.UnsupportedEncodingException;

import java.util.Arrays;

Run

可见,只要是方法声明的Checked Exception,不在调用层捕获,也必须在更高的调用层捕获。所有未捕获的异常,最终也必须在main()方法中捕获,不会出现漏写try的情况。这是由编译器保证的。main()方法也是最后捕获Exception的机会。

如果是测试代码,上面的写法就略显麻烦。如果不想写任何try代码,可以直接把main()方法定义为throws Exception:

// try...catch

import java.io.UnsupportedEncodingException;

import java.util.Arrays;

Run

因为main()方法声明了可能抛出Exception,也就声明了可能抛出所有的Exception,因此在内部就无需捕获了。代价就是一旦发生异常,程序会立刻退出。

还有一些童鞋喜欢在toGBK()内部“消化”异常:

static byte[] toGBK(String s) {

try {

return s.getBytes("GBK");

} catch (UnsupportedEncodingException e) {

// 什么也不干 }

return null;

这种捕获后不处理的方式是非常不好的,即使真的什么也做不了,也要先把异常记录下来:

static byte[] toGBK(String s) {

try {

return s.getBytes("GBK");

} catch (UnsupportedEncodingException e) {

// 先记下来再说: e.printStackTrace();

}

return null;

所有异常都可以调用printStackTrace()方法打印异常栈,这是一个简单有用的快速打印异常的方法。

小结

Java使用异常来表示错误,并通过try ... catch捕获异常;

Java的异常是class,并且从Throwable继承;

Error是无需捕获的严重错误,Exception是应该捕获的可处理的错误;

RuntimeException无需强制捕获,非RuntimeException(Checked Exception)需强制捕获,或者用throws声明;

不推荐捕获了异常但不进行任何处理。

关注乐字节,这里有更多更好的Java干货知识

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

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

相关文章

数据通信原理_同网段主机通信原理

本篇文章介绍数据通信中最基础,最关键的原理之一,两台通网段的主机如何通信。获得更多技术资料和免费学习视频,加入讨论群:752160765适合两台普通电脑之间,两台服务器之间,两台手机之间,电脑和打…

java jdk 未知错误_解决JAVA JDK安装出错的最常见问题,帮你排除困扰

一般来说,安装JAVA JDK的整个流程是很简单的,只要按照提示进行操作即可,就不会出现问题。但是呢,有小伙伴反映说,之前安装了JAVA JDK,进行卸载重装的时候出现错误提示,“正在进行另一Java安装”…

定义const变量是不可以赋值_JavaScript的声明方法和作用范围,常见的结构赋值类型和使用场景...

链接:https://juejin.im/post/5d9bf530518825427b27639d声明const命令:声明常量 let命令:声明变量作用作用域全局作用域函数作用域:function() {}块级作用域:{}作用范围var 命令在全局代码中执行const命令和let命令只能…

java社区活跃度_Java并发编程-活跃度问题

在讲问题前,我先说明一下什么是活跃度?一个并发应用及时执行的能力称作活跃度。我主要讲死锁问题,顺带介绍一下饥饿,弱响应性和活锁。死锁死锁这个词大家都听过,我先来罗列一下产生死锁的四个必要条件:(1) …

python post 上传文件_如何在 Python 中模拟 post 表单来上传文件

展开全部发个以前用urllib2模块来做的62616964757a686964616fe4b893e5b19e31333335343366class HTTPError(urllib2.HTTPDefaultErrorHandler):def __init__(self):self.errMsg def getErrorMsg(self):return self.errMsgdef http_error_default(self, req, fp, code, msg, hdr…

java8 di_java8 多个list对象用lambda求差集操作

业务场景:调用同步接口获取当前全部有效账户,数据库已存在部分账户信息,因此需要筛选同步接口中已存在本地的帐户。调用接口获取的数据集合List list response.getData().getItems();本地查询出来的账户集合List towList accountRepository…

怎么抓python程序的包_如何在AWS上部署python应用程序

如何在AWS上部署python应用程序,学姐呕心沥血亲自总结,亲测有效,比网上看网上大把大把的文档要快得多!作者:蕾学姐亚马逊云计算服务(Amazon Web Services,缩写为AWS),由亚…

【Hadoop】Zookeeper架构/特点

Zookeeper 中的角色主要有以下三类: Zookeeper需要保证高可用性和强一致性为了支持更多的客户端,需要增加更多Server,但是Server增多,意味着投票阶段延迟增大,会影响整个系统的性能。所以在3.3.0中ZK引入的新角色&…

json 反射java 实体_java反射实现javabean转json

BeantoModel->利用cglibBeanMap.create(src);直接将Bean装成Map,然后model._setAttrs(map)即可。ModeltoBean麻烦一点,最简单的方法是用json了。这个bean.dao.put应该是不对的,应该是bean.put吧,还有也不需要转换成map吧&#…

wpf 按钮样式_键盘 | 01.在程序集间引用样式

设置Button和TextBox的特定颜色和字体的样式和默认样式,并在程序集间引用。从零开始用WPF/C#开发一个键盘指示器项目完整开源、免费,不依赖第三方库编译好的先行版程序在微信公众号(香辣恐龙蛋)下载。文章同时发布在微信公众号(香辣恐龙蛋)、B站(香辣恐龙…

怎么去除表中的系统导出的字符_EXCEL非常有用的字符函数LEN、LENB,财务工作者的必备利器...

LEN函数与LENB函数是比较常用的函数,在实际中应用那是相当广的,尤其在财务工作中的使用频率是相当的高。我就一起看看实际工作中哪些地方用到了它。我们先简单说下它的用法,很简单,LEN(text)、LENB(text),两个用法是一…

laravel mysql视图_php-动态更新Laravel视图

我正在通过JS从API加载数据,将数据发送到Laravel控制器并将其保存到数据库中.加载所有Ajax之后,我想在master.blade的子视图/部分中显示数据-可以在页面加载完成后动态呈现视图,-稍后,我想更新数据库行并显示新的视图中的数据动态.//afater Ajax loading - update / display th…

python3打开excel_python3操作Excel (一)

安装:pip install openpyxlexcel表中有图像,需要安装pillow库。pip install Pillow代码:from openpyxl import Workbookwb Workbook()# grab the active worksheetws wb.active# Data can be assigned directly to cellsws[‘A1‘] 42# Rows can also…

java 获得json对象的属性值_JSON 获取属性值的方法

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习…

python常用包数据分析_数据分析领域常用的五个Python包

NumpyNumpy提供了两种基本的对象:ndarray和ufunc。ndarray是存储单一数据类型的多维数组,而ufunc是能够对数组进行处理的函数。Numpy的功能:N维数组,一种快速、高效使用内存的多维数组,他提供矢量化数学运算。可以不需…

python中空字符串的布尔值是什么_Python的布尔值与空值

Googlehack之Github hacksite:aircrk.com smtpsite:aircrk.com smtp mail.comsite:aircrk.com root passwordsite:aircrk.com smtp ...lock#ifndef lock_h #define lock_h #include #include #include "myd ...SQL2012删除作业失败的处理修改msdb数据库中的过程sp_delete_…

java软尾山地车碳_JAVA FURIA 27.5入门软尾山地车评测

铝合金车架、前后100mm避震行程、超短把立、长款燕把、27.5轮径……之前跟大家讲过,在这台车上你能拥有全避震车型所应该具备的所有基础元素。2个月的时间已经过去,这台车到底怎么样呢?我们一起来看一下。优点:质量靠谱&#xff0…

pytorch和python有什么区别_PyTorch到底好用在哪里?

先来回答一下你提的几个问题:Pytorch连最基本的maximum, minimum, tile等等这些numpy和tensorflow中最简单的运算都没有,用view来reshape还会报错contiguous(虽然我知道怎么解决),官方手册也查不到相应说明,这个东西到底好用在哪里…

java arraylist 过滤_关于java:ArrayList过滤器

本问题已经有最佳答案,请猛点这里访问。如何从Java ARAYLIST中筛选出一些东西,如:你好吗?你怎么做乔迈克过滤器是"怎样"的,它可以去除乔和迈克。这可能有助于stackoverflow.com/questions/122105/&helli…

如何下载python安装包的所有依赖_如何将包含所有依赖项的python包安装到Docker镜像中?...

我在Ubuntu 15.10中使用Docker容器为Pyspark jupyter / pyspark-notebook工作.我需要安装具有所有依赖项的folium并在容器中运行Pyspark脚本.我成功安装了Docker,拉出了图像并使用命令运行它docker run -d -p 8888:8888 -p 4040:4040 -v /home/$MYUSER/$MYPROJECT:/home/jovyan…