review08

所谓异常就是程序运行时可能出现的一些错误,比如试图打开一个根本不存在的文件等,异常处理将会改变程序的控制流程,让程序有机会对错误做出处理。

各个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\n", 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元\n", 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元\n",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自语句(当然也包括其后的所有语句)。

猜你喜欢

转载自www.cnblogs.com/liaoxiaolao/p/9260076.html