使用try-catch块,filewriter和printwriter在java中创建自定义类

时间:2014-04-03 22:21:03

标签: java try-catch filewriter printwriter custom-exceptions

尝试使用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;
    }

}

1 个答案:

答案 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);
    }
}