2013-07-23 4 views
0

Я делаю простую текстовую игру, где вам нужно вводить команды для предварительной обработки определенных действий. Недавно я добавил в игру функцию, которая позволяет вам сохранить ваш прогресс. Но по какой-то причине, если вы попытаетесь сохранить игру над существующим файлом сохранения, он сработает. Вот код, который сохраняет игру (, когда не спасти он говорит: «Был ошибка при попытке сохранить данные игры Игра будет закрыта..», Как ожидается,):Сбой программы Java при перезаписывании существующего .txt-файла?

import java.util.Formatter; 
import javax.swing.JOptionPane; 

public class Gamesave { 
    private static Formatter gamesave; 
    private static Formatter firstTimeSave; 
    private static Formatter attackpoints; 
    private static Formatter defensepoints; 
    private static Formatter skillpoints; 
    private static Formatter wins; 
    private static Formatter loses; 
    private static Formatter money; 
    // Attackpoints, defensepoints, skillpoints, wins, loses, money 
    public static void openFile(){ 
     try{ 
      attackpoints = new Formatter("c:\\FightNight\\Saves\\"+MainClass.newProfileName+"\\"+MainClass.newProfileName+"_attackpoints.txt"); 
      defensepoints = new Formatter("c:\\FightNight\\Saves\\"+MainClass.newProfileName+"\\"+MainClass.newProfileName+"_defensepoints.txt"); 
      skillpoints = new Formatter("c:\\FightNight\\Saves\\"+MainClass.newProfileName+"\\"+MainClass.newProfileName+"_skillpoints.txt"); 
      wins = new Formatter("c:\\FightNight\\Saves\\"+MainClass.newProfileName+"\\"+MainClass.newProfileName+"_wins.txt"); 
      loses = new Formatter("c:\\FightNight\\Saves\\"+MainClass.newProfileName+"\\"+MainClass.newProfileName+"_loses.txt"); 
      money = new Formatter("c:\\FightNight\\Saves\\"+MainClass.newProfileName+"\\"+MainClass.newProfileName+"_money.txt"); 
      gamesave = new Formatter("c:\\FightNight\\Saves\\"+MainClass.newProfileName+"\\"+MainClass.newProfileName+".txt"); 
      firstTimeSave = new Formatter("c:\\FightNight\\Game Data\\firstTimeSave.txt"); 
     }catch (Exception e) {JOptionPane.showMessageDialog(null, "There was an error when trying to save game data. The game will now close."); System.exit(0);} 

    } 

    public static void addRecords(){ 
     attackpoints.format("%s",MainClass.attackpoints); 
     defensepoints.format("%s",MainClass.defensepoints); 
     skillpoints.format("%s",MainClass.skillpoints); 
     wins.format("%s",MainClass.wins); 
     loses.format("%s",MainClass.loses); 
     money.format("%s",MainClass.money); 
     firstTimeSave.format("%b", MainClass.firstTime); 

    } 

    public void closeFile(){ 
     attackpoints.close(); 
     defensepoints.close(); 
     skillpoints.close(); 
     wins.close(); 
     loses.close(); 
     money.close(); 
     gamesave.close(); 
     firstTimeSave.close(); 
    } 

} 

Вот код, который вызывает классы:

static class SaveAction implements ActionListener{ 
     public void actionPerformed (ActionEvent e){ 
      try{ 
       Gamesave.openFile(); 
       Gamesave.addRecords(); 
       save.closeFile(); 
       JOptionPane.showMessageDialog(null, "Your game has been saved."); 
      }catch (Exception e1) {JOptionPane.showMessageDialog(null, "Sorry, that is an invalid response.");} 
     } 
    } 

Еще одно замечание, когда игра запускается в первый раз на компьютере, он создает каталоги для сохранения файлов и что-нибудь еще нужны. Благодарим за помощь!

Трассировка стека:

java.io.FileNotFoundException: c:\FightNight\Saves\null\null_attackpoints.txt (The system cannot find the path specified) 
    at java.io.FileOutputStream.open(Native Method) 
    at java.io.FileOutputStream.<init>(Unknown Source) 
    at java.io.FileOutputStream.<init>(Unknown Source) 
    at java.util.Formatter.<init>(Unknown Source) 
    at Gamesave.openFile(Gamesave.java:16) 
    at CommandLine$SaveAction.actionPerformed(CommandLine.java:93) 
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) 
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) 
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) 
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source) 
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) 
    at java.awt.Component.processMouseEvent(Unknown Source) 
    at javax.swing.JComponent.processMouseEvent(Unknown Source) 
    at java.awt.Component.processEvent(Unknown Source) 
    at java.awt.Container.processEvent(Unknown Source) 
    at java.awt.Component.dispatchEventImpl(Unknown Source) 
    at java.awt.Container.dispatchEventImpl(Unknown Source) 
    at java.awt.Component.dispatchEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) 
    at java.awt.Container.dispatchEventImpl(Unknown Source) 
    at java.awt.Window.dispatchEventImpl(Unknown Source) 
    at java.awt.Component.dispatchEvent(Unknown Source) 
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
    at java.awt.EventQueue.access$000(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue$4.run(Unknown Source) 
    at java.awt.EventQueue$4.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue.dispatchEvent(Unknown Source) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.run(Unknown Source) 
+0

Скопируйте трассировку стека из командной строки. – Phani

ответ

0

кажется все ваши GameSave методы являются статическими, за исключением метода closeFile. Однако все ссылки на одни и те же поля. Попробуйте сделать closeFile статическим. Кажется, все-таки ссылаются на статические поля.

И, конечно, назовите его, как и другие методы, например: GameSave.closeFile, а не someInstanceOfGameSave.closeFile.

И, наконец, если это не сработает, добавьте строку e.printStackTrace(); перед тем, как отобразить диалоговое окно сообщения и распечатать полученную трассировку стека в качестве редактирования вашего вопроса.

Редактировать

Убедитесь, что вы проверить нули в методе closeFile, а также.

+0

Он по-прежнему дает мне ошибку после ее изменения на статический. –

+0

Большое спасибо за помощь, мне удалось исправить ее благодаря вам! –

+0

@MohsenMaesumi добро пожаловать – Mena

0

Это потому, что у вас есть нули в пути к файлу. Обратите внимание на первую строку вашего стека ошибка

java.io.FileNotFoundException: c:\FightNight\Saves\**null\null**_attackpoints.txt (The system cannot find the path specified) 

Там нет никакой возможности, что вы можете иметь нуль в имени пути к файлу. Итак, с учетом сказанного вам нужно вернуться и исправить объекты, содержащие информацию в этой части кода. Также обратите внимание на это:

at Gamesave.openFile(Gamesave.java:16) 

Эта строка сообщает вам, где именно ошибка ..

Таким образом, позволяет проверить, что метод ...

try{ 
     attackpoints = new Formatter("c:\\FightNight\\Saves\\"+MainClass.newProfileName+"\\"+MainClass.newProfileName+"_attackpoints.txt"); 
     defensepoints = new Formatter("c:\\FightNight\\Saves\\"+MainClass.newProfileName+"\\"+MainClass.newProfileName+"_defensepoints.txt"); 
     skillpoints = new Formatter("c:\\FightNight\\Saves\\"+MainClass.newProfileName+"\\"+MainClass.newProfileName+"_skillpoints.txt"); 
     wins = new Formatter("c:\\FightNight\\Saves\\"+MainClass.newProfileName+"\\"+MainClass.newProfileName+"_wins.txt"); 
     loses = new Formatter("c:\\FightNight\\Saves\\"+MainClass.newProfileName+"\\"+MainClass.newProfileName+"_loses.txt"); 
     money = new Formatter("c:\\FightNight\\Saves\\"+MainClass.newProfileName+"\\"+MainClass.newProfileName+"_money.txt"); 
     gamesave = new Formatter("c:\\FightNight\\Saves\\"+MainClass.newProfileName+"\\"+MainClass.newProfileName+".txt"); 
     firstTimeSave = new Formatter("c:\\FightNight\\Game Data\\firstTimeSave.txt"); 
    }catch (Exception e) {JOptionPane.showMessageDialog(null, "There was an error when trying to save game data. The game will now close."); System.exit(0);} 

Я не вижу, что путь этот класс обращается к переменной newProfileName статического класса «MainClass» .... так что, скорее всего, причина в том, почему вы не получаете правильную информацию в имени файла.

Я бы сказал, чтобы обновить NEWPROFILENAME внутри/поймать блок попробовать, чтобы держать его в курсе ...

что-то вроде так

try{ 

     MainClass.newProfileName = //accessed information from whereever you get your new profile name in the Code.... 
     attackpoints = new Formatter("c:\\FightNight\\Saves\\"+MainClass.newProfileName+"\\"+MainClass.newProfileName+"_attackpoints.txt"); 
     defensepoints = new Formatter("c:\\FightNight\\Saves\\"+MainClass.newProfileName+"\\"+MainClass.newProfileName+"_defensepoints.txt"); 
     skillpoints = new Formatter("c:\\FightNight\\Saves\\"+MainClass.newProfileName+"\\"+MainClass.newProfileName+"_skillpoints.txt"); 
     wins = new Formatter("c:\\FightNight\\Saves\\"+MainClass.newProfileName+"\\"+MainClass.newProfileName+"_wins.txt"); 
     loses = new Formatter("c:\\FightNight\\Saves\\"+MainClass.newProfileName+"\\"+MainClass.newProfileName+"_loses.txt"); 
     money = new Formatter("c:\\FightNight\\Saves\\"+MainClass.newProfileName+"\\"+MainClass.newProfileName+"_money.txt"); 
     gamesave = new Formatter("c:\\FightNight\\Saves\\"+MainClass.newProfileName+"\\"+MainClass.newProfileName+".txt"); 
     firstTimeSave = new Formatter("c:\\FightNight\\Game Data\\firstTimeSave.txt"); 
    }catch (Exception e) {JOptionPane.showMessageDialog(null, "There was an error when trying to save game data. The game will now close."); System.exit(0);} 

Система получает нуль в имени файла, которое не может быть.Null означает, что это ничего, d не имеет положения каталога ... так что найдите способ обновить эту переменную, и это должно исправить это ...

Надеюсь, это поможет!

+0

Спасибо за помощь, проблема решена :) –

+0

Хорошо, не проблема :) немного разъяснения о том, как читать ошибки и применять их все :) – user2277872

Смежные вопросы