今天学会了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;
}
}