2016-05-13 86 views
0

我想爲hang子手遊戲做一個高分。所以我需要保存它,所以它不會重新啓動,每次開始遊戲或返回到菜單..所以我有一個playstate記錄在遊戲結束時的勝利和損失,如果用戶離開之前解決它增加了損失。我發現一個教程,通過SavaData文件保存..問題是它保存一個空文件沒有什麼在那裏,但有2個空行..所以我得到一個numberformatexception空..我以前的工作,但它仍然不會閱讀該行,並會返回一個錯誤numberformatexception Integer.parseInt ..我知道問題是在閱讀線,現在我不知道什麼地方出錯請幫助我..最新錯誤的代碼??感謝名單儲蓄遊戲得分

這是保存代碼...

private void createSaveData() { 

     File file = new File(saveDataPath, filename); 
     try { 

      FileWriter output = new FileWriter(file); 
      BufferedWriter writer = new BufferedWriter(output); 
      writer.write("" + 0); 
      writer.newLine(); 
      writer.write("" + 0); 

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

    } 

    private void setScores() { 

     FileWriter output = null; 

     try { 

      File F = new File(saveDataPath, filename); 
      output = new FileWriter(F); 
      BufferedWriter writer = new BufferedWriter(output); 
      writer.write(wins); 
      writer.newLine(); 
      writer.write(losses); 
      writer.close(); 

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

private void loadScores() { 
    try { 

     File F = new File(saveDataPath, filename); 

     BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(F))); 

     String line = reader.readLine(); 

     line = reader.readLine(); 
     wins = Integer.parseInt(line); 

     line = reader.readLine(); 
     losses = Integer.parseInt(line); 

     reader.close(); 


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

} 

我再加入loadScore();在playstate的乞討...和setScore();在贏得++或虧損後++ ..

我有另一個高級的狀態,調用playstate並獲取作爲一個整數的勝利和lossess,並且沒有任何問題,因此它繪製0,0。

在我的渲染方法,我有這個,如果嘗試是太大,或者如果正確答案猜測...

if (tries == 6) { 

     currentWord = ranWord; 
     execcurrentframe.setRegion(eman.ExecLoss.getKeyFrame(elapsedTime, false)); 
     hangcurrentframe.setRegion(hman.hangdead.getKeyFrame(elapsedTime, false)); 
     Wordsfont.draw(batch, "Game Over", eman.getPosition().x + 60, hman.getPosition().y + 70); 
     batch.draw(fu, 160, 510); 

     if (leverpressed == false){ 

      bksound.stop(); 
      lever.play(); 
      leverpressed = true; 

     } 

     if (lossrecorded == false) { 
      losses += 1; 
      System.out.print("Losses = " + losses); 
      setScores(); 
      lossrecorded = true; 

     } 
    } 
    else if (CorrectAnswer == true) { 
     hangcurrentframe.setRegion(hman.hangwin.getKeyFrame(elapsedTime, false)); 
     Wordsfont.draw(batch, "You Won", eman.getPosition().x + 60, hman.getPosition().y + 70); 


     if (winrecorded == false) { 
      bksound.stop(); 
      victory.play(); 
      wins += 1; 
      System.out.print("Wins = " + wins); 
      setScores(); 
      winrecorded = true; 

     } 
    } 
+0

一個評論,一定要關閉'createSaveData()'中的作者。您還應該將所有'.close()'方法調用放在finally塊中,或者使用Java 7的try-with-resources方法。 – KevinO

+0

我注意到,即使在教程中他也沒有添加..仍然沒有幫助只改變了錯誤.lang.NumberFormatException:對於輸入字符串:「」+加上閱讀問題.. java.lang.Integer.parseInt(Integer .java:481) – Joe

+0

(1)您是否同時使用'createSaveData'和'setScores'? 「勝利」和「損失」是什麼類型? – RealSkeptic

回答

0

我會建議進行以下更改。

  1. 使用單個writeSaveData方法。 createSaveDatasetScores之間的代碼在很大程度上是重複的。另外,使用Integer.toString()來編寫輸出。此外,確保流關閉(這裏使用資源嘗試)。

    private void writeSaveData(int wins, int losses) 
    { 
        File file = new File(saveDataPath, filename); 
        try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) { 
        writer.write(Integer.toString(wins)); 
        writer.newLine(); 
        writer.write(Integer.toString(losses)); 
    
        } 
        catch (Exception e) { 
         e.printStackTrace(); 
        } 
    
    } 
    
  2. 有一個在loadScores()方法的額外readLine()。刪除多餘的線。更改爲使用資源嘗試。

    private void loadScores() 
    { 
        File file = new File(saveDataPath, filename); 
    
        try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)))) { 
        String line = reader.readLine(); 
    
        // line = reader.readLine() <-- REMOVE THIS LINE 
        wins = Integer.parseInt(line); 
    
        line = reader.readLine(); 
        losses = Integer.parseInt(line); 
    
        reader.close(); 
    
    
        } 
        catch (Exception e) { 
        e.printStackTrace(); 
        } 
    } 
    

編輯:如果一個人不能使用嘗試用資源,那麼下面的方法可以替代使用。

private void loadScores() 
{ 
    File file = new File(saveDataPath, filename); 

    BufferedReader reader = null; 
    //  try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)))) { 
    try { 
     reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));    
     String line = reader.readLine(); 

     wins = Integer.parseInt(line); 

     line = reader.readLine(); 
     losses = Integer.parseInt(line); 
    } 
    catch (Exception e) { 
     e.printStackTrace(); 
    } 
    finally { 
     if (reader != null) { 
      try { 
       reader.close(); 
      } 
      catch (IOException ioe) { 
       ioe.printStackTrace(); 
      } 
     } 
    } 
} 

可以對建議的writeSaveData()或其他方法進行類似的修改。

+0

得到一個錯誤說在這個語言級別不支持嘗試資源?是版本問題還是僅僅是錯誤的導入庫? ty爲你提供幫助 – Joe

+0

我把這個vs改成了1.7,但仍然得到一個錯誤..任何想法都是?使用android工作室 – Joe

+0

我不知道你是如何編譯的(即IDE,javac等)。如果嘗試使用資源不可用,則可以將該聲明移到try之外,然後添加finally以關閉它們。我會盡快更新答案。 – KevinO

0

你忽略原createSaveData方法的一個重要組成部分:

writer.write("" + 0); 

看到"" + 0?它有效地將整數轉換爲一個字符串(雖然有更好的方法來做到這一點)。

BufferedWriter重載了write方法。這意味着當參數是String時會調用另一種方法,而當參數是int時會調用另一種方法。

您已調用參數爲int的版本。它documentation說:

public void write(int c) throws IOException

寫入單個字符。

覆蓋

類Writer寫

參數:

c - int指定一個字符是 書面

拋出:

IOException - 如果發生I/O錯誤

這告訴你它認爲你作爲一個角色通過了int。也就是說,如果您給它int 65,它將被視爲字符A。如果你給它int 48,它將被視爲字符0

如果你給它的整數0,這是NUL控制字符。

當您將其作爲字符串讀取時,它被視爲包含NUL字符的單字符字符串。當然,這不是一個有效的字符串格式。

所以更換

 writer.write(wins); 

隨着

 writer.write(String.valueOf(wins)); 

而且損失也這樣做。

+0

謝謝你的信息...即時新的這個,但我明白你說我把整數轉換爲一個字符串,然後調用它作爲一個int ..要嘗試下面的方法因爲它結合了我的兩種方法..如果不是會做這一個 – Joe