2013-04-03 73 views
1

我遇到了解决notSeriazable问题的问题,我所有的类实现了可升级性,但它总是给我一个关于它的错误。java扫描仪上的NotSerializableException?

java.io.NotSerializableException: java.util.Scanner 
at java.io.ObjectOutputStream.writeObject0(Unknown Source) 
at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source) 
at java.io.ObjectOutputStream.writeSerialData(Unknown Source) 
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) 
at java.io.ObjectOutputStream.writeObject0(Unknown Source) 
at java.io.ObjectOutputStream.writeObject(Unknown Source) 
at Assign3.main(Assign3.java:119) 

扫描仪是一类对的,我没有道理..我想的是,扫描仪也应该被序列化?但我无法触摸扫描仪类。

Bank b = new Bank(100.0); 
    try{ 
     ObjectOutputStream save = new ObjectOutputStream(new FileOutputStream("try.txt")); 

     save.writeObject(b); 


     save.close(); 

     }catch(Exception ex){ex.printStackTrace();} 



import java.io.Serializable; 
import java.util.Scanner; 



public class Bank implements Serializable{ 
/** 
* 
*/ 
private static final long serialVersionUID = 1L; 
private int Maxtransaction = 1000; 
public Transaction[] transactions = new Transaction[Maxtransaction]; 
private int numTransactions = 0; 
private double balance; 
Scanner sn = new Scanner(System.in); 

public Bank() 
{ 
} 

public Bank(double balance) 
{ 
    this.balance = balance; 
} 

public double getBalance() 
{ 
    return balance; 
} 

public void display() 
{ 
    System.out.print("\nTRANSACTION RECORD:\n"); 
    for(int i = 0; i<numTransactions;i++) 
     { 
     System.out.print(transactions[i].toString()+"\n"); 
     } 
    System.out.print("BALANCE : $"+getBalance()+"\n"); 

} 

public boolean addTransaction(Category categories) 
{ 
    if(numTransactions>Maxtransaction){return false;} 
    else{ 
    String[] chooseaccountletter = {"c","d"}; 
    String chooseaccount; 
    boolean erroraccount = true; 

    System.out.print("\n"); 
    do{ 
    System.out.print("Enter a c for credit or d for debit: "); 
     chooseaccount = sn.nextLine(); 
     for(int i = 0 ; i<chooseaccountletter.length;i++) 
      { 
       if(chooseaccountletter[i].equals(chooseaccount)) 
       { 
        erroraccount = false; 
        break; 
       } 
      } 
     }while(erroraccount); 

    if(chooseaccountletter[0].equals(chooseaccount)) 
    { 
     Transaction credit = new CreditTransaction(); 
     credit.getTransactionInfo(categories); 
     credit.getAmout(); 
     balance += credit.getAmout(); 
     transactions[numTransactions] = credit; 
    }//end credit 

    if(chooseaccountletter[1].equals(chooseaccount)) 
    { 
     Transaction debit = new DebitTransaction(); 
     debit.getTransactionInfo(categories); 
     debit.getAmout(); 
     balance += debit.getAmout(); 
     transactions[numTransactions] = debit; 
    }//end debit 
    numTransactions++; 
    return true; 
    } 

} 

public void displayCategory(String Category) 
{ 
    double total = 0; 
    System.out.print("\nTransactions for Category "+Category+" :\n"); 


    for(int i = 0; i<numTransactions;i++){ 
     if(transactions[i].getCategory() == Category) 
      { 
       System.out.print(transactions[i].toString()+"\n"); 
       total += transactions[i].getAmout(); 
      } 
     } 

    System.out.print("Category Balance : $"+total+"\n"); 
} 

} 
+0

您在哪里使用扫描仪对象? – zizoujab 2013-04-03 22:50:10

+0

银行内部类 – user2242573 2013-04-03 22:53:54

回答

3

没有Scanner没有执行Serializable,所以如果你的Bank类包含一个Scanner对象它也不会被序列化。您必须删除Scanner或将其标记为transientstatic以使Bank对象可序列化。 (请注意,这标志着扫描仪为静态会使它属于类的Bank不是个别的情况。你可能最好让短暂的。)

+1

那么我该怎么做?把它放在主类中? – user2242573 2013-04-03 22:54:22

+0

okie2x虐待给它一个尝试.. thx的意见 – user2242573 2013-04-03 22:55:14

1

请说明会员Bank有哪些成员。如果其任何成员没有实现Serializable,那么该类本身不能被序列化,除非明确标记为使用瞬态排除。

+0

Okie已经在箱子上更新它。 – user2242573 2013-04-03 22:53:15

1

马克Scanner对象的银行类作为transient使它可序列化,或将Scanner对象移入方法。