尝试使用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;
}
}
答案 0 :(得分:1)
您正在从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);
}
}