尝试用try-catch块包围此代码。但是,在多次失败的尝试之后,当用户输入的余额小于0时,我仍然无法将其抛出CUSTOM异常消息。我试图将其保持为极其简单的学习目的。我主要抛出IOException和InvalidException,但是我似乎无法弄清楚如何调用自定义异常消息。我删除了它,因此此处的代码对查看者来说更简单。关于应如何纠正此问题的任何逻辑建议?任何反馈表示赞赏。
import java.util.Scanner;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
public class TestAccountWithException
{
public static void main(String[] args) throws IOException, InvalidBalanceException
{
// variable declaration
String fileName;
String firstName;
String lastName;
double balance;
int id = 1122;
final double RATE = 4.50;
Scanner input = new Scanner(System.in);
System.out.print("Please enter file name: ");
fileName = input.next();
File fw = new File(fileName);
// check if file already exists
while(fw.exists())
{
System.out.print("File already exists, enter valid file name: ");
fileName = input.next();
fw = new File(fileName);
}
System.out.print("Enter your first name: ");
firstName = input.next();
System.out.print("Enter your last name: ");
lastName = input.next();
// combine first and last name
String fullName = firstName.concat(" " + lastName);
System.out.print("Input beginnning balance: ");
balance = input.nextDouble();
// pass object to printwriter and use pw to write to the file
PrintWriter pw = new PrintWriter(fw);
// print to created file
pw.println(firstName);
pw.println(lastName);
pw.println(balance);
pw.println(id);
pw.println(RATE);
AccountWithException acctException = new AccountWithException(fullName, balance, 1122, 4.50);
System.out.println(acctException.toString());
} // end main
} // end class
// Account with exception class
public class AccountWithException {
private int id;
private double balance;
private static double annualInterestRate;
private java.util.Date dateCreated;
// CRE additions for lab assignment
private String name;
// no-arg constructor to create default account
public AccountWithException() {
this.dateCreated = new java.util.Date();
}
// constructor for test account with exception that takes in arguments
public AccountWithException(String newName, double newBalance, int newId, double newRate) {
this.name = newName;
this.balance = newBalance;
this.id = newId;
AccountWithException.annualInterestRate = newRate;
this.dateCreated = new java.util.Date();
}
// accessor methods
public int getId() {
return this.id;
}
public double getBalance() {
return this.balance;
}
public static double getAnnualInterestRate() {
return annualInterestRate;
}
public double getMonthlyInterest() {
return this.balance * (this.annualInterestRate / 1200);
}
public java.util.Date getDateCreated() {
return this.dateCreated;
}
public String getName() {
return this.name;
}
// mutator methods
public void setId(int newId) {
this.id = newId;
}
public void setBalance(double newBalance) throws InvalidBalanceException {
if(balance >= 0) {
this.balance = newBalance;
}
else {
throw new InvalidBalanceException(balance);
}
}
public static void setAnnualInterestRate(double newAnnualInterestRate) {
annualInterestRate = newAnnualInterestRate;
}
public void setName(String newName) {
this.name = newName;
}
// balance modification methods
public void withdraw(double amount) {
this.balance -= amount;
}
public void deposit(double amount) {
this.balance += amount;
}
// override of Object method
public String toString() {
// return string with formatted data
// left-align 20 character column and right-align 15 character column
return String.format("%-20s%15d\n%-20s%15tD\n%-20s%15s\n%-20s%15.2f%%\n%-20s%,15.2f\n",
"ID:", this.id,
"Created:", this.dateCreated,
"Owner:", this.name,
"Annual Rate:", this.annualInterestRate,
"Balance:", this.balance);
}
}
public class InvalidBalanceException extends Exception {
private double balance;
public InvalidBalanceException(double balance) {
// exceptions constructor can take a string as a message
super("Invalid Balance " + balance);
this.balance = balance;
}
public double getBalance() {
return balance;
}
}
最佳答案
您正在从setBalance()
方法引发异常,但是没有在构造函数中调用它。您只是直接在成员变量上设置值。
尝试以下方法:
// constructor for test account with exception that takes in arguments
public AccountWithException(String newName, double newBalance, int newId, double newRate) throws InvalidBalanceException {
setName(newName);
setBalance(newBalance);
setId(newId);
setAnnualInterestRate(newRate);
this.dateCreated = new java.util.Date();
}
另外,您的
setBalance
方法将不起作用,您正在检查现有余额是否非法,而不是新值。尝试以下方法:
public void setBalance(double newBalance) throws InvalidBalanceException {
if (newBalance >= 0) {
this.balance = newBalance;
} else {
throw new InvalidBalanceException(balance);
}
}