java中checked和unchecked 异常处理
有两种类型的异常:一种是checked异常一种是unchecked异常,在这篇文章中我们将利用实例来学习这两种异常,checked的异常和unchecked异常最大的区别就是checked去唱是在编译时检查的而unchecked异常是在运行时检查的。
什么是checked异常呢?
checked异常在编译时检查,这意味着如果一个方法抛出checked异常,那么它应该使用try-catch块或者使用throws关键字来处理这个异常,否则的话程序会报编译错误,命名为checked异常是因为是在编译时checked的。
用例子来理解这个问题,在这个例子中,我们读取myfile.txt这个文件并且将它的内容输出到屏幕上,在下边这个程序中有三处异常被抛出。FileInputStream使用了指定的文件路径和名称,抛出FileNotFoundException,这个读取文件内容的read()函数抛出IOException异常,关闭文件输入流的close()函数同样也抛出IOException异常。
- import java.io.*;
- class Example {
- public static void main(String args[])
- {
- FileInputStream fis = null;
- /*This constructor FileInputStream(File filename)
- * throws FileNotFoundException which is a checked
- * exception*/
- fis = new FileInputStream("B:/myfile.txt");
- int k;
- /*Method read() of FileInputStream class also throws
- * a checked exception: IOException*/
- while(( k = fis.read() ) != -1)
- {
- System.out.print((char)k);
- }
- /*The method close() closes the file input stream
- * It throws IOException*/
- fis.close();
- }
- }
输出的结果:
- Exception in thread "main" java.lang.Error: Unresolved compilation problems:
- Unhandled exception type FileNotFoundException
- Unhandled exception type IOException
- Unhandled exception type IOException
为什么这个会编译错误呢?像我在一开始提到的checked异常在编译时被检查,因为我们没有处理这些异常,我们的编译程序报出了编译错误。
怎么解决这个错误呢?有两种方式避免这种错误,我们一条一条的来看:
方法一:使用throws关键字声明异常
我们知道在main()函数里有三个checked异常发生,那么避免这种编译错误的一种方式就是:在方法上使用throws关键字声明一个异常,你或许会想我们的代码抛出FileNotFoundException和IOEXception,为什么我们是声明了一个IOException呢,原因是IOException是FileNotFoundException的父类,前者默认覆盖了后者,如果你想你也可以这样声明异常:
- public static void main(String args[]) throws IOException, FileNotFoundException.
- import java.io.*;
- class Example {
- public static void main(String args[]) throws IOException
- {
- FileInputStream fis = null;
- fis = new FileInputStream("B:/myfile.txt");
- int k;
- while(( k = fis.read() ) != -1)
- {
- System.out.print((char)k);
- }
- fis.close();
- }
- }
输出结果:
File content is displayed on the screen.
方法二:使用try-catch块处理异常
上一种方法并不是很好,那不是处理异常最好的方式,你应该对每一个异常给出有意义的信息,使那些想了解这些错误的人能够理解,下边是这样的代码:
- import java.io.*;
- class Example {
- public static void main(String args[])
- {
- FileInputStream fis = null;
- try{
- fis = new FileInputStream("B:/myfile.txt");
- }catch(FileNotFoundException fnfe){
- System.out.println("The specified file is not " +
- "present at the given path");
- }
- int k;
- try{
- while(( k = fis.read() ) != -1)
- {
- System.out.print((char)k);
- }
- fis.close();
- }catch(IOException ioe){
- System.out.println("I/O error occurred: "+ioe);
- }
- }
- }
上边的代码能够正常运行,并将内容显示出来
下边是一些其他的checked异常
SQLException
IOEXception
DataAccessException
ClassNotFoundException
InvocationTargetException
什么是unchecked异常呢
unchecked异常在编译时不会检查,这意味着即使你没有声明或者处理异常你的程序也会抛出一个unchecked异常,程序不会给出一个编译错误,大多数情况下这些异常的发生是由于用户在交互过程中提供的坏数据。这需要程序员提前去判断这种能够产生这种异常的情况并且恰当的处理它。所有的unchecked异常都是RuntimeException的子类。
我们来看一下下边的代码:
- class Example {
- public static void main(String args[])
- {
- int num1=10;
- int num2=0;
- /*Since I'm dividing an integer with 0
- * it should throw ArithmeticException*/
- int res=num1/num2;
- System.out.println(res);
- }
- }
如果你编译这段代码,这段代码将会被通过,但是当你运行的时候它将抛出ArithmeticException。这段代码清楚的表明了unchecked异常在编译期间是不会被checked的,他们在运行期间被检查,我们来看另一个例子:
- class Example {
- public static void main(String args[])
- {
- int arr[] ={1,2,3,4,5};
- /*My array has only 5 elements but
- * I'm trying to display the value of
- * 8th element. It should throw
- * ArrayIndexOutOfBoundsException*/
- System.out.println(arr[7]);
- }
- }
这段代码同样被成功的编译通过,因为ArrayIndexOutOfBoundsException是unchecked异常。
注意:这并不意味着编译器不检查这些异常我们就不处理这些异常了,事实上我们需要更加小心的处理这些异常,例如在上边的例子中,应该提供给用户一个他想读取的信息在数组中不存在的信息,以便用户修改这个问题
- class Example {
- public static void main(String args[])
- {
- try{
- int arr[] ={1,2,3,4,5};
- System.out.println(arr[7]);
- }catch(ArrayIndexOutOfBoundsException e){
- System.out.println("The specified index does not exist " +
- "in array. Please correct the error.");
- }
- }
- }
这里还有其他的一些常见的unchecked异常:
NullPointerException
ArrayIndexOutOfBoundsException
ArithmeticException
IllegalArgumentException
java中checked和unchecked 异常处理的更多相关文章
- java中checked异常和unchecked异常区别?
马克-to-win:checked和unchecked异常区别:结论就是:1)RuntimeException和他的子类都是unchecked异 常.其他的都是checked异常.马克-to-win: ...
- Java中@SuppressWarnings("unchecked")的作用
J2SE 提供的最后一个批注是 @SuppressWarnings.该批注的作用是给编译器一条指令,告诉它对被批注的代码元素内部的某些警告保持静默. 一点背景:J2SE 5.0 为 Java 语言增加 ...
- JAVA中的异常(异常处理流程、异常处理的缺陷)
异常处理流程 1)首先由try{...}catch(Exception e){ System.out.println(e); e.printStackTrace(); }finally{...}结构 ...
- 【Java】Checked、Unchecked Exception
Checked Exception:需要强制catch的异常, Unchecked Exception:这种异常时无法预料的,即RuntimeException,就是运行时的异常. Exception ...
- java中Thread的 interrupt异常处理
http://blog.csdn.net/srzhz/article/details/6804756
- java中异常的面试
https://blog.csdn.net/qq_36523638/article/details/79363652 1) Java中的检查型异常和非检查型异常有什么区别? 这又是一个非常流行的Jav ...
- 夯实Java基础系列10:深入理解Java中的异常体系
目录 为什么要使用异常 异常基本定义 异常体系 初识异常 异常和错误 异常的处理方式 "不负责任"的throws 纠结的finally throw : JRE也使用的关键字 异常调 ...
- Java中的Checked Exception——美丽世界中潜藏的恶魔?
在使用Java编写应用的时候,我们常常需要通过第三方类库来帮助我们完成所需要的功能.有时候这些类库所提供的很多API都通过throws声明了它们所可能抛出的异常.但是在查看这些API的文档时,我们却没 ...
- [Java] java中的异常处理
Java中的异常类都继承自Throwable类.一个Throwable类的对象都可以抛出(throw). Throwable对象可以分为两组.一组是unchecked异常,异常处理机制往往不用于这组异 ...
随机推荐
- bzoj2765 铁人双项比赛
Description 铁人双项比赛是吉林教育学院的一项传统体育项目.该项目比赛由长跑和骑自行车组成,参赛选手必须先完成k公里的长跑,然后完成r公里的骑车,才能到达终点.每个参赛选手所擅长的项目不同, ...
- Kubernetes集群安全配置案例
Kubernetes 系统提供了三种认证方式:CA 认证.Token 认证 和 Base 认证.安全功能是一把双刃剑,它保护系统不被攻击,但是也带来额外的性能损耗.集群内的各组件访问 API Serv ...
- Bootstrap-CSS:网格系统
ylbtech-Bootstrap-CSS:网格系统 1.返回顶部 1. Bootstrap 网格系统 本章节我们将讲解 Bootstrap 的网格系统(Grid System). Bootstrap ...
- [UE4]事件处理(Handling Events)和委托(Delegate)代码示例(一)
1. 通过重写虚函数来处理事件 MyTriggerVolume.h 自定义一个Actor类,添加一个 Box 组件作为触发区域,然后通过重写虚函数——NotifyActorBeginOverlap, ...
- [UE4]acotor放置4*4列表
// Number of blocks const int32 NumBlocks = Size * Size; // Loop to spawn each block ; BlockIndex< ...
- Eclipse里面的Maven项目打包(Maven build)
eclipse里面执行maven build打包的时候,如何设置参数? 主要就是设置一个goals
- Koa 框架整理
学习交流 Koa使用了ES6规范的generator和异步编程是一个更轻量级Web开发的框架,Koa 的先天优势在于 generator.由于是我个人的分享交流,所以Node基础.ES6标准.Web开 ...
- 最强数据集50个最佳机器学习公共数据,可以帮你验证idea!
1. 寻找数据集の奥义 根据CMU的说法,寻找一个好用的数据集需要注意一下几点: 数据集不混乱,否则要花费大量时间来清理数据. 数据集不应包含太多行或列,否则会难以使用. 数据越干净越好,清理大型数 ...
- 编写一个函数,在页面上输出一个N行M列的表格,表格内容填充0~100的随机数字
function print(n,m){ document.write("<table>"); for(var i=0; i<n; i++){ ...
- 编码风格和PEP8规范
编码风格 错误认知 这很浪费时间 我是个艺术家 所有人都能穿的鞋不会合任何人的脚 我善长制定编码规范 正确认知 促进团队合作 减少bug处理 提高可读性,降低维护成本 有助于代码审查 养成习惯,有助于 ...