2015-10-05 59 views
-1

我創建了一個計數遊戲,我試圖創建一個高分方法。Java:高分功能

問題是程序在選擇「Highscore」菜單時返回「null」。什麼可能導致這個?

import javax.swing.*; 
import java.text.DecimalFormat; 
import java.util.*; 
import java.io.*; 

public class Räknesätt { 
    public static void main(String[]args) throws IOException { 

    DecimalFormat df = new DecimalFormat("0.00"); 

    int input = Integer.parseInt(JOptionPane.showInputDialog(null, "-------------------------" + "\n\n" + 
                   "1. Spela" + "\n" + 
                   "2. Highscores" + "\n" + 
                   "3. Avsluta" + "\n\n" + 
                   "-------------------------"));          
     if(input == 2) { 
      String highscores = ""; 
      int rader = countline("Highscores"); 
      BufferedReader inström1 = new BufferedReader 
          (new FileReader("Highscores")); 


       for(int i = 0; i <= rader; i++) { 
       highscores = inström1.readLine() + "\n";     
       } 
       JOptionPane.showMessageDialog(null, highscores);                            
     } 

     else if(input == 3) { 
      System.exit(0); 
     } 

     else if(input == 1) { 

      String namn = JOptionPane.showInputDialog(null, "Skriv in ditt namn"); 

      int counter = 0; 
      int rätt = 0; 
      int fel  = 0; 

      while(counter < 10) { 
       int slump1 = 1 + (int)(Math.random()*100); 
       int slump2 = 1 + (int)(Math.random()*100); 

       List<String> räknesätt = new LinkedList<String>(Arrays.asList("+", 
                      "-", 
                      "*", 
                      "/")); 
       int räknesättRand = (int)(Math.random()*4); 
       String räknesättStr = räknesätt.get(räknesättRand);                                   
       counter++;                              

       switch(räknesättStr) { 

        case "+": 
         String svarStr1 = JOptionPane.showInputDialog(null,namn + " räkna ut: " + "\n" + slump1 + " + " + slump2 + " = "); 
         int svar1 = Integer.parseInt(svarStr1); 

          if(svar1 == slump1 + slump2) { 
          JOptionPane.showMessageDialog(null, namn + " du räknade rätt!");    
          rätt++; 
          } 
          else { 
          JOptionPane.showMessageDialog(null, namn + " du räknade fel!"); 
          fel++; 
          } 
        break;  

        case "-": 
         String svarStr2 = JOptionPane.showInputDialog(null,namn + " räkna ut: " + "\n" + slump1 + " - " + slump2 + " = "); 
         int svar2 = Integer.parseInt(svarStr2); 

          if(svar2 == slump1 - slump2) { 
          JOptionPane.showMessageDialog(null, namn + " du räknade rätt!");    
          rätt++; 
          } 
          else { 
          JOptionPane.showMessageDialog(null, namn + " du räknade fel!"); 
          fel++; 
          } 
        break;       

        case "*": 
        String svarStr3 = JOptionPane.showInputDialog(null,namn + " räkna ut: " + "\n" + slump1 + " * " + slump2 + " = "); 
        int svar3 = Integer.parseInt(svarStr3); 

         if(svar3 == slump1 * slump2) { 
          JOptionPane.showMessageDialog(null, namn + " du räknade rätt!");    
          rätt++; 
         } 
         else { 
          JOptionPane.showMessageDialog(null, namn + " du räknade fel!"); 
          fel++; 
         } 
        break;     

        case "/": 
        String svarStr = JOptionPane.showInputDialog(null,namn + " räkna ut: " + "\n" + slump1 + "/" + slump2 + " = "); 
        int svar = Integer.parseInt(svarStr); 

         if(svar == (double)slump1/slump2) { 
          JOptionPane.showMessageDialog(null, namn + " du räknade rätt!");    
          rätt++; 
         } 
         else { 
          JOptionPane.showMessageDialog(null, namn + " du räknade fel!"); 
          fel++; 
         } 

        break; 

       } 
      } 


        JOptionPane.showMessageDialog(null, "Resultat för: " + namn + "\n\n" + 
                 "=========================" + "\n" + 
                 "Antal räknade tal: " + counter + "\n" + 
                 "Antal rätt: " + rätt + "\n" + 
                 "Antal fel: " + fel + "\n" + 
                 "Rättprocent: " + (double)100*rätt/(rätt+fel) + "%"); 

        PrintWriter utström1 = new PrintWriter 
              (new BufferedWriter 
              (new FileWriter("Highscores"))); 

        utström1.println(namn + ", " + (double)100*rätt/(rätt+fel) + "% rätt");          
        utström1.close(); 
     }    
    } 

    public static int countline (String filnamn)throws IOException { 
    BufferedReader inström1 = new BufferedReader 
          (new FileReader(filnamn)); 
    int lines = 0;       

    while(inström1.readLine() != null) { 
     ++lines;  
    } 
    inström1.close(); 

    return lines;  

    }   
}     
+3

如果問題只在輸入2,您應該刪除所有關於輸入1和3不相干的代碼,您應該提出一個最小的* *例子證明的問題。請參閱http://stackoverflow.com/help/mcve –

+0

現在就代碼而言,您似乎正在讀取多於一行的文件,這意味着「highscores」將始終爲「null」\ n「' 。你真的只是想展示一條線嗎? –

回答

0

代碼試圖通過名稱'Highscores'打開一個不存在的文件句柄。 問題正在引起下面的代碼行:

BufferedReader inström1 = new BufferedReader 
       (new FileReader("Highscores")); 

的解決辦法是創建該文件的前期,在節目的開頭,寫缺省內容進去。 以下是你如何去做的。

private static void createHighScoreFile() throws IOException { 
     PrintWriter printWriter = new PrintWriter 
      (new BufferedWriter 
        (new FileWriter("Highscores"))); 
     printWriter.write("0\n"); 
     printWriter.close(); 
    } 

    public static void main(String[] args) throws IOException { 

     createHighScoreFile(); 
     DecimalFormat df = new DecimalFormat("0.00"); 

還有一個問題涉及到讀取文件的內容。 for循環中的條件嘗試從文件中讀取額外的一行,結果總是爲空。它需要通過這種方式來解決。

for (int i = 0; i <= rader; i++) { 

for (int i = 0; i < rader; i++) {