所谓异常就是程序运行时可能出现的一些错误,比如试图打开一个根本不存在的文件等,异常处理将会改变程序的控制流程,让程序有机会对错误做出处理。
各个catch参数中的异常类都是Exception的某个子类,表明try部分可能发生的异常,这些子类之间不能有父子关系。
异常对象可以调用如下方法得到或输出有关异常的信息。
public String getMessage();
public void printStackTrace();
public String toString();
java使用try-catch语句来处理异常,将可能出现的异常操作放在try-catch语句的try部分,一旦try部分抛出异常对象,或调用某个可能抛出异常对象的方法,并且该方法抛出了异常对象,那么try部分立刻结束执行,转向执行相应的catch部分。代码展示如下所示:
public class Exception { public static void main(String[] args) { // TODO Auto-generated method stub int n = 0, m = 0, t = 1000; try{ m = Integer.parseInt("8888"); n = Integer.parseInt("ab89"); t = 7777;//这后面的语句没有机会被执行 } catch(NumberFormatException e){ System.out.println("发生异常" + e.getMessage()); } System.out.println("n=" + n + ", m="+ m + ",t=" + t); try{ System.out.println("故意抛出I/O异常!"); throw new java.io.IOException("我是故意的");//故意抛出异常,throw是用来指出要抛出哪个异常的 } catch(java.io.IOException e){ System.out.println("发生异常 " + e.getMessage()); } } }
结果如下:
自定义异常类
throw关键字的作用是抛出指定的异常,而throws是方法在声明时可以用来要产生的异常,表示这个方法可能抛出这个指定的异常。
展示结果如下
BankException.java
public class BankException extends Exception { String message; public BankException(int m, int n){ message = "入账资金" + m + "是负数或指出" + n + "是正数,不符合系统要求."; } public String warnMess() { return message; } }
Bank.java
public class Bank { private int money; public void income(int in, int out)throws BankException { if(in <= 0 || out >= 0 || in + out <= 0) { throw new BankException(in, out); } int netIncome = in + out; System.out.printf("本次计算出的纯收入是:%d ", netIncome); money = money + netIncome; } public int getMoney() { return money; } }
Test01.java
public class Test01 { public static void main(String[] args) { // TODO Auto-generated method stub Bank bank = new Bank(); try{ bank.income(200, -100); bank.income(300, -100); bank.income(400, -100); System.out.printf("银行目前有%d元 ", bank.getMoney()); bank.income(200, 100); bank.income(999, -100); } catch (BankException e) { // TODO Auto-generated catch block System.out.println("计算收益的过程出现如下问题:"); System.out.println(e.warnMess()); } System.out.printf("银行目前有%d元 ",bank.getMoney()); } }
运行结果如下所示:
断言语句在调试代码阶段非常有用,当发送某个错误时,要求程序必须立即停止执行,这时就可以使用断言。
assert number >= 0;
如果number>=0为true,程序继续执行,否则立刻结束执行。
try{}
catch(ExceptionSubClass e){}
finally{}
其执行机制是:在执行try-catch语句后,执行finally子语句,也就是说,无论在try部分是否发生过异常,finally语句都会被执行。但有两点需要强调:
(1)如果在try-catch语句中执行了return语句,那么finally自语句依然会被执行。
(2)try-catch语句中执行了程序退出代码,即执行了System.exit(0);,则不执行finally自语句(当然也包括其后的所有语句)。