有两种类型的异常:一种是checked异常一种是unchecked异常,在这篇文章中我们将利用实例来学习这两种异常,checked的异常和unchecked异常最大的区别就是checked去唱是在编译时检查的而unchecked异常是在运行时检查的。

什么是checked异常呢?

checked异常在编译时检查,这意味着如果一个方法抛出checked异常,那么它应该使用try-catch块或者使用throws关键字来处理这个异常,否则的话程序会报编译错误,命名为checked异常是因为是在编译时checked的。

用例子来理解这个问题,在这个例子中,我们读取myfile.txt这个文件并且将它的内容输出到屏幕上,在下边这个程序中有三处异常被抛出。FileInputStream使用了指定的文件路径和名称,抛出FileNotFoundException,这个读取文件内容的read()函数抛出IOException异常,关闭文件输入流的close()函数同样也抛出IOException异常。

  1. import java.io.*;
  2. class Example {
  3. public static void main(String args[])
  4. {
  5. FileInputStream fis = null;
  6. /*This constructor FileInputStream(File filename)
  7. * throws FileNotFoundException which is a checked
  8. * exception*/
  9. fis = new FileInputStream("B:/myfile.txt");
  10. int k;
  11. /*Method read() of FileInputStream class also throws
  12. * a checked exception: IOException*/
  13. while(( k = fis.read() ) != -1)
  14. {
  15. System.out.print((char)k);
  16. }
  17. /*The method close() closes the file input stream
  18. * It throws IOException*/
  19. fis.close();
  20. }
  21. }

输出的结果:

  1. Exception in thread "main" java.lang.Error: Unresolved compilation problems:
  2. Unhandled exception type FileNotFoundException
  3. Unhandled exception type IOException
  4. Unhandled exception type IOException

为什么这个会编译错误呢?像我在一开始提到的checked异常在编译时被检查,因为我们没有处理这些异常,我们的编译程序报出了编译错误。

怎么解决这个错误呢?有两种方式避免这种错误,我们一条一条的来看:

方法一:使用throws关键字声明异常

我们知道在main()函数里有三个checked异常发生,那么避免这种编译错误的一种方式就是:在方法上使用throws关键字声明一个异常,你或许会想我们的代码抛出FileNotFoundException和IOEXception,为什么我们是声明了一个IOException呢,原因是IOException是FileNotFoundException的父类,前者默认覆盖了后者,如果你想你也可以这样声明异常:

  1. public static void main(String args[]) throws IOException, FileNotFoundException.
  1. import java.io.*;
  2. class Example {
  3. public static void main(String args[]) throws IOException
  4. {
  5. FileInputStream fis = null;
  6. fis = new FileInputStream("B:/myfile.txt");
  7. int k;
  8. while(( k = fis.read() ) != -1)
  9. {
  10. System.out.print((char)k);
  11. }
  12. fis.close();
  13. }
  14. }

输出结果:

File content is displayed on the screen.

方法二:使用try-catch块处理异常

上一种方法并不是很好,那不是处理异常最好的方式,你应该对每一个异常给出有意义的信息,使那些想了解这些错误的人能够理解,下边是这样的代码:

  1. import java.io.*;
  2. class Example {
  3. public static void main(String args[])
  4. {
  5. FileInputStream fis = null;
  6. try{
  7. fis = new FileInputStream("B:/myfile.txt");
  8. }catch(FileNotFoundException fnfe){
  9. System.out.println("The specified file is not " +
  10. "present at the given path");
  11. }
  12. int k;
  13. try{
  14. while(( k = fis.read() ) != -1)
  15. {
  16. System.out.print((char)k);
  17. }
  18. fis.close();
  19. }catch(IOException ioe){
  20. System.out.println("I/O error occurred: "+ioe);
  21. }
  22. }
  23. }

上边的代码能够正常运行,并将内容显示出来

下边是一些其他的checked异常

SQLException

IOEXception

DataAccessException

ClassNotFoundException

InvocationTargetException

什么是unchecked异常呢

unchecked异常在编译时不会检查,这意味着即使你没有声明或者处理异常你的程序也会抛出一个unchecked异常,程序不会给出一个编译错误,大多数情况下这些异常的发生是由于用户在交互过程中提供的坏数据。这需要程序员提前去判断这种能够产生这种异常的情况并且恰当的处理它。所有的unchecked异常都是RuntimeException的子类。

我们来看一下下边的代码:

  1. class Example {
  2. public static void main(String args[])
  3. {
  4. int num1=10;
  5. int num2=0;
  6. /*Since I'm dividing an integer with 0
  7. * it should throw ArithmeticException*/
  8. int res=num1/num2;
  9. System.out.println(res);
  10. }
  11. }

如果你编译这段代码,这段代码将会被通过,但是当你运行的时候它将抛出ArithmeticException。这段代码清楚的表明了unchecked异常在编译期间是不会被checked的,他们在运行期间被检查,我们来看另一个例子:

  1. class Example {
  2. public static void main(String args[])
  3. {
  4. int arr[] ={1,2,3,4,5};
  5. /*My array has only 5 elements but
  6. * I'm trying to display the value of
  7. * 8th element. It should throw
  8. * ArrayIndexOutOfBoundsException*/
  9. System.out.println(arr[7]);
  10. }
  11. }

这段代码同样被成功的编译通过,因为ArrayIndexOutOfBoundsException是unchecked异常。

注意:这并不意味着编译器不检查这些异常我们就不处理这些异常了,事实上我们需要更加小心的处理这些异常,例如在上边的例子中,应该提供给用户一个他想读取的信息在数组中不存在的信息,以便用户修改这个问题

  1. class Example {
  2. public static void main(String args[])
  3. {
  4. try{
  5. int arr[] ={1,2,3,4,5};
  6. System.out.println(arr[7]);
  7. }catch(ArrayIndexOutOfBoundsException e){
  8. System.out.println("The specified index does not exist " +
  9. "in array. Please correct the error.");
  10. }
  11. }
  12. }

这里还有其他的一些常见的unchecked异常:

NullPointerException
ArrayIndexOutOfBoundsException
ArithmeticException
IllegalArgumentException

java中checked和unchecked 异常处理的更多相关文章

  1. java中checked异常和unchecked异常区别?

    马克-to-win:checked和unchecked异常区别:结论就是:1)RuntimeException和他的子类都是unchecked异 常.其他的都是checked异常.马克-to-win: ...

  2. Java中@SuppressWarnings("unchecked")的作用

    J2SE 提供的最后一个批注是 @SuppressWarnings.该批注的作用是给编译器一条指令,告诉它对被批注的代码元素内部的某些警告保持静默. 一点背景:J2SE 5.0 为 Java 语言增加 ...

  3. JAVA中的异常(异常处理流程、异常处理的缺陷)

    异常处理流程 1)首先由try{...}catch(Exception e){ System.out.println(e); e.printStackTrace(); }finally{...}结构 ...

  4. 【Java】Checked、Unchecked Exception

    Checked Exception:需要强制catch的异常, Unchecked Exception:这种异常时无法预料的,即RuntimeException,就是运行时的异常. Exception ...

  5. java中Thread的 interrupt异常处理

    http://blog.csdn.net/srzhz/article/details/6804756

  6. java中异常的面试

    https://blog.csdn.net/qq_36523638/article/details/79363652 1) Java中的检查型异常和非检查型异常有什么区别? 这又是一个非常流行的Jav ...

  7. 夯实Java基础系列10:深入理解Java中的异常体系

    目录 为什么要使用异常 异常基本定义 异常体系 初识异常 异常和错误 异常的处理方式 "不负责任"的throws 纠结的finally throw : JRE也使用的关键字 异常调 ...

  8. Java中的Checked Exception——美丽世界中潜藏的恶魔?

    在使用Java编写应用的时候,我们常常需要通过第三方类库来帮助我们完成所需要的功能.有时候这些类库所提供的很多API都通过throws声明了它们所可能抛出的异常.但是在查看这些API的文档时,我们却没 ...

  9. [Java] java中的异常处理

    Java中的异常类都继承自Throwable类.一个Throwable类的对象都可以抛出(throw). Throwable对象可以分为两组.一组是unchecked异常,异常处理机制往往不用于这组异 ...

随机推荐

  1. SqlBulkCopy(批量复制)使用方法

    SqlBulkCopy提供了一种将数据复制到Sql Server数据库表中高性能的方法.SqlBulkCopy 包含一个方法 WriteToServer,它用来从数据的源复制数据到数据的目的地. Wr ...

  2. WPF Demo8

    namespace Demo10 { public class Student { private string name; public string Name { get { return nam ...

  3. FPGA将加速今日新型态数据中心的主流应用

    在这个强调智能与联网的时代,可编程逻辑栅阵列 (FPGA)已经成为一个重要且不可或缺的元件.以全球500亿个联网设备,一年所产生的数据量将不计其数.从数据中心.5G通讯.虚拟网络功能,到嵌入式系统,F ...

  4. BASIC-6_蓝桥杯_杨辉三角形

    示例代码: #include <stdio.h>#include <stdlib.h> int main(void){ int n = 0 ; int i = 0 , j = ...

  5. Zabbix二次开发_03api列表_中文版

    基于ZABBIX 3.0 https://www.zabbix.com/documentation/3.0/manual/api/reference 参考方法 本节提供了的zabbix提供的功能的概述 ...

  6. Java堆外内存之三:堆外内存回收方法

    一.JVM内存的分配及垃圾回收 对于JVM的内存规则,应该是老生常谈的东西了,这里我就简单的说下: 新生代:一般来说新创建的对象都分配在这里. 年老代:经过几次垃圾回收,新生代的对象就会放在年老代里面 ...

  7. 关于clearfix和clear的讨论

    本文摘自百度文库 还是提到了一个关于网页制作很古老的问题,浮动的清除. 虽然看过一些资料介绍说能不用浮动就尽量不要用,但对定位不是很熟的我来说,浮动就不能不用了:既然惹上这个麻烦,就得想个办法进行解决 ...

  8. 利用.pbk来实现ADSL开机自动拨号

    当你新建拨号连接或者VPN连接之后在你的电脑里会创建一个.pbk的文件 这个.pbk的文件可以说是一个集合,将你电脑的所有连接都保存在一起. 同时你还可以将此连接复制起来传给其他人. 系统默认的.pb ...

  9. Centos 6.5将光盘作为yum源的设置方法

    Centos 6.5将光盘作为yum源的设置方法 在使用Centos 的时候,用yum来安装软件包是再方便不过了,但是如果在无法连接互联网的情况下,yum就不好用了. 下面介绍一种方式,就是将Cent ...

  10. Oracle 学习SQL

    开始记录最近学习了一些基础的SQL知识. 说起数据库,想到当时学习数据库概论这本书的时候,就学了一些基本的SQL语句以及数据库理论知识,记得最当时考试的数据库范式的知识,不知当时是怎么过来的,到现在对 ...