有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用trycatch块、filewriter和printwriter在java中创建自定义类

试图用try-catch块包围此代码。然而,在多次尝试失败后,我仍然无法让它在用户输入余额小于0时抛出自定义异常消息。为了学习的目的,我尽量使它非常简单。我的主进程抛出了IOException和InvalideException,但是我似乎不知道如何调用自定义异常消息。我删除了它,因此代码在这里看起来更简单。关于我应该如何纠正这个问题,有什么合理的建议吗?任何反馈都将不胜感激

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) 个答案

  1. # 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);
        }
    }