JAVA – 程序重启时静态变量重置
发布时间:2020-12-15 05:20:57 所属栏目:Java 来源:网络整理
导读:我有一个静态计数器变量的问题.在超类(“卡”)中,我有一个变量来计算注册卡的数量(这是一个票务系统).它是这样写的: public class Card implements Serializable { private int id; public static int nextNr= 000; Card next; public Card(int t) { id= ++
我有一个静态计数器变量的问题.在超类(“卡”)中,我有一个变量来计算注册卡的数量(这是一个票务系统).它是这样写的:
public class Card implements Serializable { private int id; public static int nextNr= 000; Card next; public Card(int t) { id= ++nextNr; next= null; } } 该类实现了Serializable,我使用ObjectStream将卡写出到文件中. 但是如果我关闭程序并再次启动它,它可以从文件中读取并确认并再次将文件添加到我的cardregistry.但是,超类中的卡计数器变量被重置,我尝试注册的每张新卡都从001开始.我究竟做错了什么? 解: abstract public class Card implements Serializable { private int type; private int cardNr; private static int nextNr = readCardNr(); Card next; //COllections or not.. hmmmm public Card(int t) { cardNr= ++nextNr; next= null; type = t; writeCardNr(); } public int getType(){ return type; } public void setCardNr(int i) { cardNr= i; } public int getCardNr() { return cardNr; } public static int readCardNr() { try(DataInputStream inn= new DataInputStream(new FileInputStream("KortNummer"))) { nextNr= inn.readInt(); inn.close(); return nextNr; } catch(FileNotFoundException fnfe) { skrivMld("Fant ingen tidligere registrerte kort. Starter nytt kortregister."); nextNr= 000; return nextNr; } catch(EOFException eofe) { System.out.println("End of file"); } catch(IOException ioe) { skrivMld("Feilmelding: IO Exception"); } return nextNr; } public void writeCardNr() { try(DataOutputStream ut= new DataOutputStream(new FileOutputStream("KortNummer"))){ ut.writeInt(cardNr); } catch(IOException ioe) { skrivMld("Problem med skriving til fil."); } } 解决方法
计数器是静态的.因此,它不是任何Card实例的状态的一部分,并且序列化所有卡将不会保存计数器的值.
保存此计数器值,重新加载并明确重置它,或者在启动时从所有反序列化卡中获取最大ID,将计数器重置为此最大值. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |