Создание собственного класса в java с использованием блоков try-catch, filewriter и printwriter

Попытка окружить этот код блоком try-catch. Тем не менее, после многих неудачных попыток я все еще не могу заставить его выбросить мое сообщение об исключении CUSTOM, когда пользователь вводит баланс меньше 0. Я пытаюсь сделать его чрезвычайно простым для целей обучения. У меня есть основной бросок 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 ответ

Вы бросаете свое исключение из 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);
    }
}
Другие вопросы по тегам