想知道如何从.dat文件中读取对象

时间:2012-03-28 01:18:29

标签: java object arraylist readfile indexoutofboundsexception

所以我基本上试图制作一个“银行”计划。

到目前为止(我认为)我已经找到了将对象写入.dat文件以供将来使用的方法,并且我希望每次启动时都将这些对象读入ArrayList,以便您可以访问以前创建的帐户。

我一直在mainBank.main(mainBank.java:22)获取“java.lang.IndexOutOfBoundsException”

这是mainBank的代码:

    import java.util.*;
    import java.io.*;

    public class mainBank 
   {
private static ArrayList<Account> userList = new ArrayList<Account>();
private static int userNum;
private static Scanner scan = new Scanner(System.in);
public static void main(String args[]) throws IOException
{
    try
    {
        readFromArray();
    }
    catch(Exception e)
    {
        e.getStackTrace();
    }
    System.out.println("Welcome to the bank");
    System.out.println("Account ID");
        int uID = scan.nextInt();
    Account currAccount = new Account((Account)userList.get(uID));

    nextAction(currAccount);

}

public static void nextAction(Account acc)
{   System.out.println(acc);

    System.out.print("Are you happy with this y/n? ");
    String input = scan.nextLine();
if(input.toLowerCase().equals("y"))
{
    System.out.println("Thank you Come Again");
}
else
{
    System.out.println("What would you like to do?");
    System.out.println("1.Deposit");
    System.out.println("2.Widthdraw");
    System.out.println("3.Exit");
        int choice = scan.nextInt();
    switch(choice)
    {
    case 1: System.out.print("Deposit Ammount: ");
            acc.deposit(scan.nextInt());
            nextAction(acc);

            break;

    case 2: System.out.print("Widthdrawl Ammount: ");
            try{acc.withdraw(scan.nextInt());}
            catch(Exception e){System.out.println("not enough money");}
            nextAction(acc);

            break;

    case 3: System.out.print("Okay, Good Bye!");
            break;
    }
}


}
public static void readFromArray() throws IOException, Exception
{
    FileInputStream fis = new FileInputStream("data.dat");
    ObjectInputStream ois = new ObjectInputStream(fis);
    Account acc = new Account((Account) ois.readObject());


    for(int i = 0; i<userNum;i++)
    {       
        acc = (Account) ois.readObject();
        userList.add(acc);
    }
}
public static void writeToFile() throws IOException
{
    FileOutputStream fos = new FileOutputStream("data.dat");
    ObjectOutputStream oos = new ObjectOutputStream(fos);


    for(int i =0;i<userList.size();i++)
    {
        Account acc = userList.get(i);
        oos.writeObject(acc);
    }
    oos.flush();
    oos.close();
}
    }

帐户类:

    import java.io.Serializable;

    public class Account implements Serializable
    {
private int MONEY;
private String NAME;
private String PASSWORD;

public Account(Account acc)
{
    MONEY = acc.getMoney();
    NAME = acc.getName();
    PASSWORD = acc.getPassword();
}
private String getPassword() 
{
    return PASSWORD;
}
public Account(String n,String p,int m)
{

    MONEY = m;
    NAME =n;
    PASSWORD = p;
}

public void setMoney(int m)
{
    MONEY = m;
}
public void setName(String n)
{
    NAME=n;
}
public void deposit(int m)
{
    MONEY +=m;
}
public void withdraw(int m) throws NotEnoughMoneyException
{
    if(MONEY-m<0)
        throw new NotEnoughMoneyException();
    else
        MONEY -=m;
}

public int getMoney()
{
    return MONEY;

}
public String getName()
{
    return NAME;

}

public String toString()
{
    String s = getName()+":"+getMoney();
    return s;
}

    }

     class NotEnoughMoneyException extends Exception
   {
String msg;

NotEnoughMoneyException()
{
    msg = "Not enough Money";
}
    }

1 个答案:

答案 0 :(得分:0)

在不知道您输入System.in的情况下,您输入的值超出了数组的范围。只需仔细检查一下你是否意识到ArrayList从索引0开始吧?因此,如果ArrayList中有5个对象,则ArrayList的索引为0-4。