异常处理是一门语言是否成熟的标准之一,它提高代码的容错性,使得更加健壮。java处理异常主要通过try,catch,finally,throw,throws五个关键字组成。
异常处理的原则:先捕获小异常,再捕获大异常。
(1)普通异常处理异常的基本格式如下:
public class DivTest{
public static void main(String[] args){
try{
int a=Integer.parseInt(args[0]);
int b=Integer.parseInt(args[1]);
int c=a/b;
}
catch(IndexOutOfBoundsException ie){
System.out.println("数组越界");
}
catch(NumberFormatException ne){
System.out.println("数据格式异常")
}
catch(ArithmeticException ae){
System.out.println("算数异常,例如:0作为除数了");
}
//java7 提供的捕获多个异常,异常变量默认使用final修饰;
catch(IndexOutOfBoundsException|NumberFormatException|ArithmeticException ){
System.out.println("常见数字异常");
}
/*获取捕获异常的相关信息:
1.getMessage():返回异常详细描述字符串
2.printStackTrace():异常的跟踪栈信息输出到标准错误输出
3.printStackTrace(PrintStream s):将异常跟踪信息输出到指定输出流
4.getStackTrace():犯规异常跟踪栈信息
*/
catch(IOException ioe){
System.out.println(ioe.getMessage());
ioe.printStackTrace();
}
finally{
//资源回收块
//通常不要在此使用return和throw导致方法终止的语句,这样将导致try,catch中的return,throw语句失效
}
}
}
(3)Throw抛出异常。该异常适用于代码业务的异常,不能由系统检出,而是由程序员自己判断的异常。eg:
public class ThrowTest{
public static void main(String[] args){
try{
throwChecked(-3);
}
catch(exception e){
System.out.println(e.getMessage());
}
throRuntime(3);
}
public static void ThrowChecked(int a)throws Exception{
if(a>0){
throw new Exception("a的值大于0,不符合要求");
}
}
public static void throwRuntime(int a){
if(a>0){
throw new RuntimeException("a的值大于0,不符合要求");
}
}
}
(4)一般异常的处理流程--异常链(职责链模式)
思路:程序不应该把底层的sql异常传给用户,这样暴露底层sql代码,造成不安全因素。
正确的做法(异常转译):程序先捕获原始异常,抛出一个业务异常,新的业务异常中包含对用户的提示。
public calSal() throws SalException{
try{
//实现结算工资的业务
...
}
catch(SQLException sqle){
//将原始异常记录下来,留给管理员
...
//下面异常message对客户的提示
throw new SqlException("访问底层数据库出现异常");
//捕获原始异常
throw new SalException(sqle);
}
catch(exception e)
{
//将原始异常记录下来,留给管理员
...
//下面异常message对客户的提示
throw new SqlException("系统出现未知错误");
//捕获原始异常
throw new SalException(e);
}
}
//自定义异常类
public class SalException extends Exception
{
public SalException(){}
public SqlException(String msg){
super(msg);
}
public SalException(Throwable t){
super(t);
}
}