关于java项目中常用的异常处理情况
在java语言中,将程序执行中发生的不正常情况成为“异常”,在开发过程中的语法错误或者逻辑错误不算异常。
而常见的运行异常可以分为以下几种:输入不匹配异常,报错信息为InputMismatchException,空指针异常,报错信息为NullPointerException,数学运算异常,报错信息为ArithmeticException,数组下标越界异常,报错信息为ArrayIndexOutOfBoundsException,类型转换异常,报错信息为ClassCastException,数字格式不正确,NumberFormatException
还有一些编译异常的情况: 操作数据库时,查询表可能发生异常,报错信息为SQLException,
操作文件时,发生的异常,报错信息为IOExcepiton ,当操作一个不存在的文件时,发生异常,,报错信息为FileNotFoundException, 加载类,而该类不存在时,异常,报错信息为ClassNotFoundException ,操作文件,到文件末尾,发生异常,报错信息为EOFException,参数异常,报错信息为IIIegalArguementException.
而最为常见的便是编程异常,即编译期间必须处理的异常,否则代码不能通过编译。
为了保持整个程序的正常处理,所以必须对代码进行异常处理。
可以采用try catch语句进行处理,常见格式为:
try{
可能会异常的代码
}
cath(ExceptionNum1 e){
当产生ExceptionNum1异常会在这里进行处理 比如打印异常/比如输出对应的信息,
}
catch(ExceptionNUm2 e){
当产生ExceptionNum2异常会在这里进行处理 比如打印异常/比如输出对应的信息,
}finally{
无论上面是否会产生异常都会执行的代码
}
使用try-catch代码捕捉并处理异常时,不会因为产生异常影响程序的执行。
如果遇到需要处理多种异常信息的情况下,可以在一个try代码块后面跟多个catch代码块,如果使用了多个catch代码块,则catch代码块的异常类顺序一定是先子类后父类,否则直接编译时异常。
像数据库连接,输入输出流,网络编程socket等资源,JVM是不能自动回收的,我们需要手动的进行资源的释放。此时的资源的释放,就需要声明在finally中。
第二种方法是使用throws+异常类型,即声明抛出异常,但这种方法并不会真正的解决处理掉异常,而是相当于点出异常类型,让调用者想办法解决。
如果一个方法(中的语句执行时)可能生成某种异常,但是并不能确定如何处理这种异常,则此方法应显示地声明抛出异常,表面该方法不对这些异常进行处理,而由该方法的调用者负责处理。
在方法声明中用throws语句可以声明抛出的异常的列表(可以抛出多个异常),throws后面的异常类型可以是方法中产生的异常类型,也可以是它的父类(多个异常用一个exception代替)。
该方法写在方法的声明处,此时此方法执行时,可能会抛出的类型。 如果一个方法(中的语句执行时)可能生成某种异常, 但是并不能确定如何处理这种异常, 则此方法应显示地声明抛出异常,表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理。 在方法声明中用throws语句可以声明抛出异常的列表, throws后面的异常类型可以是方法中产生的异常类型, 也可以是它的父类。 一旦方法体执行时,出现异常,仍会在异常代码处,生成一个异常类的对象,此对象满足throws后异常类型是,就会被抛出。异常代码后续的代码,就不在执行。 throws的方式只是将异常抛给了方法的调用者,并没有真正将异常处理掉。
此外用户还可以通过自定义异常类去对错误信息进行描述和输出:
基本概念: 当程序中出现了某些“错误”,但是该错误信息并没有在 Throwable 子类中描述处理,这个时候可以自己设计异常类,用于描述该错误信息。
基本步骤:定义类:自定义异常类名(程序员自己写)继承 Exception或者RuntimeException。
如果继承Exception,属于编译异常。如果继承RuntimeException,属于运行异常(一般来说,继承RuntimeException)。一般情况下,我们自定义异常是继承 RuntimeException, 即把自定义异常做成 运行时异常,好处是,我们可以使用默认的处理机制。比较方便。
同时异常类的方法也很重要:getMessage()方法用于返回该异常的详细描述字符,
printStackTrace()方法用于将该异常的跟踪栈信息输出到标准错误输出。(异常链)
printStackTrace(PrintStream s)方法用于将该异常的跟踪栈信息输出到指定的输出流
getStackTrace()方法用于返回该异常的跟踪栈信息。
最后要注意异常处理的规则:
异常处理机制只能用于处理不可预知的异常(将其与业务代码分离开),不能用来代替正常的流程控制,一般尽量避免catch all语句(导致无法对不同异常区分处理),不要忽略捕获到的异常
在平时的开发过程中,不要忽略异常,在那些容易产生错误的地方,或者自己不确定的地方,多使用try catch语句保证做到心中有数。