Java学习——异常处理
摘要:本文主要介绍了在Java开发中常用的的异常处理。
异常基础
定义
异常,是指在运行时期发生的不正常情况。
如果不对异常进行正确的处理,则可能导致程序的中断执行,造成不必要的损失,所以在程序的设计中必须要考虑各种异常的发生,并正确的做好相应的处理,这样才能保证程序正常的执行。
异常分类
异常在Java中使用Exception这个类表示,其父类是Throwable,Throwable有两个子类,Exception(异常)和Error(错误)。
Exception,是指一般由人为造成,可以避免和处理的。Exception又分为ChickException(受检异常)和RuntimeException(非受检异常)。
Error,是指严重的错误,如硬盘损坏、内存不足等,无法避免和解决的致命错误。
受检异常(CheckedException)
也称为编译异常,是指编译时被编译器检出的异常,在编译时就必须处理的异常。
◆ ClassNotFoundException:类未找到异常,未正确加载类导致的异常,一般发生在加载类的代码中,比如: Class.forName(className); 。
◆ SQLException:SQL异常,一般会发生在和数据库建立连接,或者对返回结果进行处理的时候,比如: Connection connection = DriverManager.getConnection(url, user, password); 。
◆ IOException:文件异常,一般在读写数据的时候会出现这种问题,比如: String line = new BufferedReader(fileReader).readLine(); 。
◆ FileNotFoundException:文件不存在异常,属于IOException的子类,一般在读取文件的时候会产生异常,需要进行异常处理,比如: FileReader fileReader = new FileReader(new File(fileName)); 。
非受检异常(RuntimeException)
也称为运行时异常,是指在程序运行时出现的异常,编译时不会提示异常,所以在编译时不用处理,系统会默认打印到日志里。
◆ NullPointerException:空指针异常,最为常见的一种异常,获取值为null的对象的属性,或者通过null的对象调用了方法。
◆ ArrayIndexOutOfBoundsException:数组下标越界异常,获取数组的值的时候,尝试获取不在下标范围内的下标的值。
◆ ClassCastException:类型转换异常,尝试将两个类进行强制转换时有可能会报这个异常。
◆ ArithmeticException:算术异常,进行数学运算时会发生的异常。
◆ NumberFormatException:数字转换异常,尝试将非数字的数据类型转换为数字类型时,会报这种错误。
异常处理
捕获异常并进行处理
在Java中如果需要处理异常,必须先对异常进行捕获,然后再对异常情况进行处理。在Java中使用try和catch关键字对异常进行捕获,还可以使用finally保证即便在出现了异常后,仍能执行的操作。
try语句块包括的是可能会发生异常的代码段,执行时可能会有一种或者多种异常发生。当有异常发生时,会交给catch处理,如果没有发生异常,则略过catch语句块。
catch语句块里需要的参数是某种异常类型,一个try代码块可能有一个或者多个catch代码块,以便对不同的异常捕获处理。
finally语句块为异常代码提供必要的处理,只要程序在执行,无论发生了什么,最后都会执行finally里的代码。
public void readFile(String name) { FileReader fr = null; try { fr = new FileReader(new File(name)); } catch (FileNotFoundException e) { e.printStackTrace(); } finally { try { fr.close(); } catch (IOException e) { e.printStackTrace(); } } }
throw关键字可以在catch到相应类型的异常后,将异常重新抛出,交由上一级调用的代码处理。
try { System.out.println(name.length()); } catch (NullPointerException e) { throw e; }
抛出异常
如果不想捕获和处理出现的异常,可以使用throws关键字把产生的异常抛出,交给调用方法的上一级代码处理。
public void readFile(String name) throws IOException { FileReader fr = new FileReader(new File(name)); fr.close(); }
如果在catch捕获之后,使用throw抛出了受检异常,同样需要使用throws关键字进行抛出处理。
public void readFile(String name) throws IOException { try { FileReader fr = new FileReader(new File(name)); fr.close(); } catch (IOException e) { throw e; } }
自定义异常
创建异常类
命名规则为XxxException,继承自Exception类或者其子类。
定义自定义异常的有参构造方法,调用父类的有参构造方法。
使用自定义异常
使用throw关键字,调用自定义异常的构造方法,传入异常信息,实现抛出自定义异常。