异常是程序中的一些错误,但并非全部的错误都是异常,而且错误有时候是能够避免的。java
好比说,你的代码少了一个分号,那么运行出来结果是提示是错误 java.lang.Error;若是你用System.out.println(11/0),那么你是由于你用0作了除数,会抛出 java.lang.ArithmeticException 的异常。程序员
Java中的异常主要分为下列几类:函数
全部的异常类是从 java.lang.Exception 类继承的子类。 Exception 类是 Throwable 类的子类。除了Exception类外,Throwable还有一个子类Error 。它们之间的关系入下图:code
从Exception继承的类都是异常,异常能够被处理,处理完后程序仍然能够继续运行。从Error继承来的类都是错误,在运行时错误没法被处理,只能修改代码逻辑。从Runtime中继承的类都是运行时异常,这类异常在程序中能够处理,也能够不处理。而非运行时异常在代码中必须处理。否则编译会报错。对象
Java中的异常处理主要有下列几种:blog
throw
在指定方法中抛出指定异常。好比 throw IOException();
在方法中抛出了一个IO异常throws
将异常抛出给调用者处理。在函数声明时使用。方法声明时能够抛出多个异常,若是多个异常有继承关系,那么只须要抛出父类异常便可。若是父类的方法没有抛出异常,子类在重写父类方法时也不能使用这种方式抛出异常try...catch
处理异常。在使用try 处理异常时须要注意:继承
Throwable
中定义了3个异常处理的方法:资源
String getMessage()
: 返回异常的详细信息String toString()
: 返回异常的简短信息void printStackTrace()
: 打印异常的调用信息这些异常信息通常在try...catch 中使用,例如get
try { //do something }catch(Exception e){ e.printStackTrace(); }
不管异常是否发生,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{ //关闭交易通道 }