Java中如何自主定义一个异常类(Exception)并且使用

今天学会了Java中如何自定义一个异常类,还明白了throw/throws,try和catch的用法。
前几天上机课的时候,老师让我们写过一个银行存取钱的系统,今天刚好碰上异常处理,就顺便把异常处理应用上去。

下面是没有加上异常处理的银行存取钱代码(用户名账号和密码默认是admin):

import java.util.Date;
import java.util.Scanner;
public class Account {
	private String id="admin";//账号
	private String pc="admin";//密码
	private double balance=0;//余额
	private double annuallnterestRate=0.05;//存储当前利率
	private Date dateCreated;//存储账户的开户日期。
	Account(){}
	Account(String id,double balance){
		this.id=id;
		this.balance=balance;
	}
	//id、balance 和annuallnterstRate 的访问器和修改器。
	public String Getid()
	{
		return id;
	}
	public void Setid(String id)
	{
		this.id=id;
	}
	public double Getbalance()
	{
		return balance;
	}
	public void Setbalance(double balance){
		this.balance=balance;
	}
	public double GetannuallnterstRate()
	{
		return annuallnterestRate;
	}
	public void SetannuallnterestRate(double annuallnterestRate)
	{
		this.annuallnterestRate=annuallnterestRate;
	}
	//dateCreated 的访问器
	public Date GetdateCreated()
	{
		return dateCreated;
	}
	double getMonthlyInterestRate()//返回月利率
	{
		return annuallnterestRate/12;
	}
	void withDraw(double money) //从账户提取特定数额
	{
		balance-=money;
		}
			
	}
	void deposit(double money)//向账户存储特定数额
	{
		balance+=money;
	}
	public static void main(String[] args)
	{
		double b;//存款数额
		String c;//检测是否为注册新用户,或储存老用户账号
		String d;//新用户账号
		String e;//新用户密码
		String f;//老用户账号
		String g;//老用户密码
		boolean flag=false;//用以标记用户是否成功登陆
		Scanner input=new Scanner(System.in);
		System.out.println("请输入您的银行账号:(如未注册请输入“注册”字样)");
		c=input.nextLine();
		Account a=new Account();
		if(c.equals("注册"))
		{
			System.out.println("请输入您的账号,符号账号与字母结合均可,不建议使用空格");
			d=input.nextLine();
			a.Setid(d);
			System.out.println("请输入您的密码,符号账号与字母结合均可,不建议使用空格");
			e=input.nextLine();
			System.out.println("注册成功!将自动调转到服务界面");
			flag=true;
		}
		else
		{
			System.out.println("请输入密码:");
			g=input.nextLine();
			do {
			if(c.equals(a.id)&&g.equals(a.pc)) {
				System.out.println("登陆成功,将自动调转到服务界面");
				flag=true;
				break;
				}
			else
				System.out.println("密码错误,请重新输入密码");
			g=input.nextLine();}
			while(true);
		}
		if(flag==true)
		{
			System.out.println("您的账号:"+a.Getid());//获取对象a的id
			System.out.println("您的余额:"+a.Getbalance());//获取对象a的余额
			System.out.println("当前年利率:"+a.GetannuallnterstRate());
			System.out.println("请输入存款数额:");
			b=input.nextDouble();
			a.deposit(b);
			System.out.println("当前账户的余额为:"+a.Getbalance());
			System.out.println("请输入取款数额:");
			b=input.nextDouble();
			a.withDraw(b);
			}
			System.out.println("当前账户的余额为:"+a.Getbalance());
		}	
	}
}

使用步骤

第一步:先定义一个的异常类:

//自定义的一个异常类,继承自Exception,当要求取出的钱比余额还多的时候
//就会抛出异常,交由这个类处理。
class InsufficientFundsException extends Exception{
	private double amount;
	//这里的amount用来存储当出现异常(取出的钱多余余额时)
	//所缺乏的钱,比如只有500,要取出700,这里的amount
	//就等于200
	public InsufficientFundsException(double amount) {
		this.amount=amount;
	}
	public double getAmount()
	{
		return amount;
	}
}

第二步:找到取钱的这一个方法,在这个方法的后面加上throws,把异常抛出
原先的取钱方法:

void withDraw(double money)
	{
		balance-=money;
		}

余额是有可能为负数的,所以在这里加上了异常检测

改进的:

 void withDraw(double money) throws InsufficientFundsException//从账户提取特定数额
    	{
    		if(money<=balance)
    		balance-=money;
    		else {
    			double needs=money-balance;
    			throw new InsufficientFundsException(needs);
    		}

上面改进的代码,一旦发现取出的钱比余额还要多的时候,就会把多余的部分(needs)抛出。

第四步:抛出的异常需要接收并进行处理,找到调用取钱的这个方法,在他的附近框上一个try和catch就可以了。

			try{
			System.out.println("请输入取款数额:");
			b=input.nextDouble();
			a.withDraw(b);
			}
			catch(InsufficientFundsException q )
			 {
			System.out.println("取出的数目不可以大于余额哦!还少"+q.getAmount()
			+"呢。");		
			}

如果withDraw抛出异常,那么try就会发现这个异常,交由catch处理,catch的形参是一个自定义的异常类类型,名字叫做q,对q做一些输出,就可以清楚的看到是因为取钱导致的异常处理。

最后放上全部的代码,注册和登录是我一时兴起做的,大家可以不必理会。

import java.util.Scanner;
public class Account {
	private String id="admin";//账号
	private String pc="admin";//密码
	private double balance=0;//余额
	private double annuallnterestRate=0.05;//存储当前利率
	private Date dateCreated;//存储账户的开户日期。
	Account(){}
	Account(String id,double balance){
		this.id=id;
		this.balance=balance;
	}
	//id、balance 和annuallnterstRate 的访问器和修改器。
	public String Getid()
	{
		return id;
	}
	public void Setid(String id)
	{
		this.id=id;
	}
	public double Getbalance()
	{
		return balance;
	}
	public void Setbalance(double balance){
		this.balance=balance;
	}
	public double GetannuallnterstRate()
	{
		return annuallnterestRate;
	}
	public void SetannuallnterestRate(double annuallnterestRate)
	{
		this.annuallnterestRate=annuallnterestRate;
	}
	//dateCreated 的访问器
	public Date GetdateCreated()
	{
		return dateCreated;
	}
	double getMonthlyInterestRate()//返回月利率
	{
		return annuallnterestRate/12;
	}
	void withDraw(double money) throws InsufficientFundsException//从账户提取特定数额
	{
		if(money<=balance)
		balance-=money;
		else {
			double needs=money-balance;
			throw new InsufficientFundsException(needs);
		}
			
	}
	void deposit(double money)//向账户存储特定数额
	{
		balance+=money;
	}
	public static void main(String[] args)
	{
		double b;//存款数额
		String c;//检测是否为注册新用户,或储存老用户账号
		String d;//新用户账号
		String e;//新用户密码
		String f;//老用户账号
		String g;//老用户密码
		boolean flag=false;//用以标记用户是否成功登陆
		Scanner input=new Scanner(System.in);
		System.out.println("请输入您的银行账号:(如未注册请输入“注册”字样)");
		c=input.nextLine();
		Account a=new Account();
		if(c.equals("注册"))
		{
			System.out.println("请输入您的账号,符号账号与字母结合均可,不建议使用空格");
			d=input.nextLine();
			a.Setid(d);
			System.out.println("请输入您的密码,符号账号与字母结合均可,不建议使用空格");
			e=input.nextLine();
			System.out.println("注册成功!将自动调转到服务界面");
			flag=true;
		}
		else
		{
			System.out.println("请输入密码:");
			g=input.nextLine();
			do {
			if(c.equals(a.id)&&g.equals(a.pc)) {
				System.out.println("登陆成功,将自动调转到服务界面");
				flag=true;
				break;
				}
			else
				System.out.println("密码错误,请重新输入密码");
			g=input.nextLine();}
			while(true);
		}
		if(flag==true)
		{
			System.out.println("您的账号:"+a.Getid());//获取对象a的id
			System.out.println("您的余额:"+a.Getbalance());//获取对象a的余额
			System.out.println("当前年利率:"+a.GetannuallnterstRate());
			System.out.println("请输入存款数额:");
			b=input.nextDouble();
			a.deposit(b);
			System.out.println("当前账户的余额为:"+a.Getbalance());
			try{System.out.println("请输入取款数额:");
			b=input.nextDouble();
			a.withDraw(b);}catch(InsufficientFundsException q ) {
				System.out.println("取出的数目不可以大于余额哦!还少"+q.getAmount()
				+"呢。");
				
			}
			System.out.println("当前账户的余额为:"+a.Getbalance());
		}
		
	}
}
//自定义的一个异常类,继承自Exception,当要求取出的钱比余额还多的时候
//就会抛出异常,交由这个类处理。
class InsufficientFundsException extends Exception{
	private double amount;
	//这里的amount用来存储当出现异常(取出的钱多余余额时)
	//所缺乏的钱,比如只有500,要取出700,这里的amount
	//就等于200
	public InsufficientFundsException(double amount) {
		this.amount=amount;
	}
	public double getAmount()
	{
		return amount;
	}
}

你可能感兴趣的:(Java中如何自主定义一个异常类(Exception)并且使用)