[Java]如何创建文本文件来存储单个数字并不断更新该数字?
这是我用来尝试存储一个不断变化的数字的代码,但是我遇到了错误,我在JavaGUI中这样做。我不明白为什么它不起作用。第一次在stackOverFlow上发布[Java]如何创建文本文件来存储单个数字并不断更新该数字?,java,user-interface,Java,User Interface,这是我用来尝试存储一个不断变化的数字的代码,但是我遇到了错误,我在JavaGUI中这样做。我不明白为什么它不起作用。第一次在stackOverFlow上发布 public void addPoints(int points, String fileName) throws IOException { String name = (fileName + ".dat"); File file = new File(name); if (!fil
public void addPoints(int points, String fileName) throws IOException
{
String name = (fileName + ".dat");
File file = new File(name);
if (!file.exists())
{
file.createNewFile();
}
try (BufferedReader inStream = new BufferedReader(new FileReader(file)))
{
String inString;
int rndInt;
while((inString = inStream.readLine()) != null)
{
rndInt = Integer.parseInt(inString);
points += rndInt;
clearFile(fileName);
FileWriter fw = new FileWriter(file.getAbsoluteFile());
BufferedWriter bw = new BufferedWriter(fw);
bw.write(String.valueOf(points));
bw.close();
}
inStream.close();
}
}
我犯了一个错误
Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: ""
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:569)
at java.lang.Integer.parseInt(Integer.java:615)
at ComputerScienceIAGUI.addPoints(ComputerScienceIAGUI.java:1080)
at ComputerScienceIAGUI.jButton12ActionPerformed(ComputerScienceIAGUI.java:856)
at ComputerScienceIAGUI.access$1300(ComputerScienceIAGUI.java:25)
at ComputerScienceIAGUI$14.actionPerformed(ComputerScienceIAGUI.java:576)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6535)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
at java.awt.Component.processEvent(Component.java:6300)
at java.awt.Container.processEvent(Container.java:2236)
at java.awt.Component.dispatchEventImpl(Component.java:4891)
at java.awt.Container.dispatchEventImpl(Container.java:2294)
at java.awt.Component.dispatchEvent(Component.java:4713)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466)
at java.awt.Container.dispatchEventImpl(Container.java:2280)
at java.awt.Window.dispatchEventImpl(Window.java:2750)
at java.awt.Component.dispatchEvent(Component.java:4713)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.awt.EventQueue$4.run(EventQueue.java:731)
at java.awt.EventQueue$4.run(EventQueue.java:729)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
还有Jbutton的代码,这是我能想到的唯一其他原因
private void jButton12ActionPerformed(java.awt.event.ActionEvent evt) {
try
{
addPoints(Integer.parseInt(jTextField15.getText()), "Ruby");
addPoints(Integer.parseInt(jTextField16.getText()), "Amber");
addPoints(Integer.parseInt(jTextField17.getText()), "Pearl");
addPoints(Integer.parseInt(jTextField18.getText()), "Sapphire");
}
catch(IOException ioe)
{}
}
编辑:它工作!!但是代码可能不是最有效的,不过还是要感谢所有的帮助。下面的代码设法创建一个单独的文件,其中存储1个可以增加或减少的数字
private void jButton12ActionPerformed(java.awt.event.ActionEvent evt) {
try
{
String rP,aP, sP, pP;
rP = jTextField15.getText();
aP = jTextField16.getText();
pP = jTextField17.getText();
sP = jTextField18.getText();
addPoints(rP, "Ruby");
addPoints(aP, "Amber");
addPoints(pP, "Pearl");
addPoints(sP, "Sapphire");
infoBox("Points have been saved!", "Message");
}
catch(IOException ioe)
{}
}
另一部分呢
public void addPoints(String points, String fileName) throws IOException
{
String name = (fileName + ".dat");
File file = new File(name);
if (!file.exists())
{
file.createNewFile();
FileWriter fw = new FileWriter(file.getAbsoluteFile());
BufferedWriter bw = new BufferedWriter(fw);
bw.write("0");
bw.close();
}
try (BufferedReader inStream = new BufferedReader(new FileReader(file)))
{
String inString;
int rndInt;
if((inString = inStream.readLine()) != null)
{
rndInt = Integer.parseInt(inString);
int number = Integer.parseInt(points) + rndInt;
clearFile(fileName);
FileWriter fw = new FileWriter(file.getAbsoluteFile());
BufferedWriter bw = new BufferedWriter(fw);
bw.write(String.valueOf(number));
bw.close();
inStream.close();
}
else
{
FileWriter fw = new FileWriter(file.getAbsoluteFile());
BufferedWriter bw = new BufferedWriter(fw);
bw.write("0");
bw.close();
}
}
}
java.lang.NumberFormatException:对于输入字符串:
根据Java文档,我在此引用:
引发NumberFormatException以指示应用程序已尝试将字符串转换为其中一种数字类型,但该字符串没有适当的格式
现在,您的文件创建和读取部分很好,因为您已经在执行空检查,所以不会失败
我认为空字符串来自任何JTextField,所以在将其解析为整数之前,需要检查空字符串或空字符串
您可以使用具有良好实用方法的番石榴库
注意:如果您可以将行号与代码片段一起发布,它可以帮助我们更好地识别问题,然后尝试使用此您得到的确切错误是什么?我不明白为什么它不起作用。。。发布错误的内容或错误输出将有助于获得正确答案。一目了然:如果文件不存在,则创建它。然后你从中读到一行——一个空行。然后使用Integer.parseInt将空行转换为整数。这注定要失败。因此我建议:如果文件不存在,不要尝试从中读取。不过,我可能遗漏了什么。它不一定会失败,因为他已经进行了空检查,如果文件不存在,他会创建一个文件并进行检查。如果文件不存在,不要尝试从中读取同意,但如果文件不存在,他正在创建它,然后尝试从中读取,但根据OP的逻辑,他将永远无法从该文件中读取,因为新创建的文件在br.readLine方法中始终为null感谢您比我更深入地研究它。不过,我不可能看到自己为了这个简单的目的引入了对第三方库的依赖。我根据您的建议重新编写了代码,它可以工作,谢谢@奥列夫。使用第三方库不是强制性的,我们可以创建自己的方法来执行空值检查,但由于它已经存在,因此给出了一个建议。