Java 学习笔记(11)——异常处理

异常是程序中的一些错误,但并非全部的错误都是异常,而且错误有时候是能够避免的。java

好比说,你的代码少了一个分号,那么运行出来结果是提示是错误 java.lang.Error;若是你用System.out.println(11/0),那么你是由于你用0作了除数,会抛出 java.lang.ArithmeticException 的异常。程序员

Java中的异常主要分为下列几类:函数

  1. 检查性异常:最具表明的检查性异常是用户错误或问题引发的异常,这是程序员没法预见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。
  2. 运行时异常: 运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常能够在编译时被忽略。
  3. 错误: 错误不是异常,而是脱离程序员控制的问题。错误在代码中一般被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。

全部的异常类是从 java.lang.Exception 类继承的子类。 Exception 类是 Throwable 类的子类。除了Exception类外,Throwable还有一个子类Error 。它们之间的关系入下图:code

异常类

从Exception继承的类都是异常,异常能够被处理,处理完后程序仍然能够继续运行。从Error继承来的类都是错误,在运行时错误没法被处理,只能修改代码逻辑。从Runtime中继承的类都是运行时异常,这类异常在程序中能够处理,也能够不处理。而非运行时异常在代码中必须处理。否则编译会报错。对象

Java中异常处理的方式

Java中的异常处理主要有下列几种:blog

  1. 使用 throw 在指定方法中抛出指定异常。好比 throw IOException(); 在方法中抛出了一个IO异常
  2. 使用 throws 将异常抛出给调用者处理。在函数声明时使用。方法声明时能够抛出多个异常,若是多个异常有继承关系,那么只须要抛出父类异常便可。若是父类的方法没有抛出异常,子类在重写父类方法时也不能使用这种方式抛出异常
  3. try...catch 处理异常。

在使用try 处理异常时须要注意:继承

  • 若是catch 中捕获的有多个异常,且异常间有继承关系,那么必须把子类写在前面,父类在后面

异常中的经常使用方法

Throwable 中定义了3个异常处理的方法:资源

  1. String getMessage(): 返回异常的详细信息
  2. String toString(): 返回异常的简短信息
  3. void printStackTrace(): 打印异常的调用信息

这些异常信息通常在try...catch 中使用,例如get

try
{
    //do something
}catch(Exception e){
    e.printStackTrace();
}

finally 关键字

不管异常是否发生,finally中的代码都会执行。通常finally中编写释放资源的代码,好比释放文件对象。须要注意的是,finally中会改变return的执行顺序,无论return在哪,都会最后执行finally中的returnit

try{
    //do some thing
    return;
}catch(Exception e)
{
    return;
}
finally{
    return; //会执行这个 
}

return;

自定义异常类

自定义异常时须要注意:

  • 异常类都必须继承自 Throwable类,若是要定义检查性异常,须要继承 Exception,要定义运行时异常,须要继承 RuntimeException
class MyException extends Exception{
}

假设咱们定义一个异常类,表示取钱的异常,当取钱数少于1000时报异常,提示用户去ATM取,能够这样写

class TooLittleMoneyException extends Exception
{
    private int money;
    private String message;

    TooLittleMoneyException(int money){
        message = "" + money + "太少,请到ATM自助取款机去取";
    }

    String getMessage(){
        return message;
    }
}

//取钱方法
//打开交易通道
//校验帐户是否合法
try{
    if (money < 1000){
        throw TooLittleMoneyException(money);
    }

    //取钱,并在对应帐户中减小相应的金额
}catch(TooLittleMoneyException e){
    System.out.println(e.getMessage());
}finally{
    //关闭交易通道
}
相关文章
相关标签/搜索