2013-04-03 74 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對象移入方法。