2013-03-18 24 views
1

我有一個簡單的Java程序,似乎運行良好,直到上傳到我的學校的評分系統「WebCat」,我假設它只是運行JUnit。它踢回的錯誤是:分叉的Java VM異常退出。 JUnit測試?

分叉Java VM異常退出。請注意,報告中的時間不會反映出虛擬機退出前的時間。

我已經研究過這個問題,主要的第一個故障排除步驟似乎是查看轉儲日誌。不幸的是,我不能這樣做。考慮到缺乏評分系統的反饋以及缺少編譯或運行時錯誤,我對如何開始排除此故障感到非常失望。

這裏是代碼,如果任何人都熟悉這個錯誤,或者至少可以給我一些方向從哪裏開始故障排除。非常感激!

import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.InputStreamReader; 
import java.util.Scanner; 
import java.io.IOException; 



class PlayerApp { 
    public static void showMenu() 
    { 
     System.out.println("Player App Menu"); 
     System.out.println("P - Print Report"); 
     System.out.println("A - Add Score"); 
     System.out.println("D - Delete Score"); 
     System.out.println("L - Find Lowest Score"); 
     System.out.println("H - Find Highest Score"); 
     System.out.println("Q - Quit"); 
    } 
    public static void main(String[] args) throws IOException 
    { 
     if (args.length == 0) 
     { 
      System.out.println("File name was expected as a run argument."); 
      System.out.println("Program ending."); 
      System.exit(0); 
     } 
     String fileName = args[0]; 
     Scanner sc = new Scanner(System.in); 
     String stnew = ""; 
     boolean exit = false; 
     Player p = null; 
     double[] scoreList; 

     File dbFile = new File(fileName); 
     FileInputStream fis = new FileInputStream(fileName); 
     InputStreamReader inStream = new InputStreamReader(fis); 
     BufferedReader stdin = new BufferedReader(inStream); 
     String name = stdin.readLine(); 
     stnew = stdin.readLine(); 
     int numScore = Integer.parseInt(stnew); 
     scoreList = new double[numScore]; 
     for (int i = 0; i < numScore; i++) 
     { 
      stnew = stdin.readLine(); 
      scoreList[i] = Double.parseDouble(stnew); 
     } 

     p = new Player(name, numScore, scoreList); 

     stdin.close(); 

     System.out.println("File read in and Player object created."); 
     showMenu(); 
     while (exit == false) 
     { 

     System.out.print("\nEnter Code [P, A, D, L, H, or Q]:"); 
     String choice = sc.nextLine().toLowerCase(); 
     if (choice.equals("p")) 
     { 
      System.out.println(p.toString()); 
     } 
     else if (choice.equals("a")) 
     { 
      System.out.print(" Score to add: "); 
      stnew = sc.nextLine(); 
      double scoreIn = Double.parseDouble(stnew); 
      p.addScore(scoreIn); 
     } 
     else if (choice.equals("d")) 
     { 
      System.out.print(" Score to delete: "); 
      stnew = sc.nextLine(); 
      double scoreIn = Double.parseDouble(stnew); 
      p.deleteScore(scoreIn); 
      System.out.println(" Score removed."); 
     } 
     else if (choice.equals("l")) 
     { 
      System.out.println(" Lowest score: " + p.findLowestScore()); 
     } 
     else if (choice.equals("h")) 
     { 
      System.out.println(" Highest score: " + p.findHighestScore()); 
     } 
     else if (choice.equals("q")) 
     { 
      exit = true; 
     } 
     } 


    } 
} 

休息

import java.text.DecimalFormat; 



public class Player { 

    //Variables 
    private String name; 
    private int numOfScores; 
    private double[] scores = new double[numOfScores]; 

    //Constructor 
    public Player(String nameIn, int numOfScoresIn, double[] scoresIn) { 
     name = nameIn; 
     numOfScores = numOfScoresIn; 
     scores = scoresIn; 
    } 

    //Methods 
    public String getName() { 
     return name; 
    } 
    public double[] getScores() { 
     return scores; 
    } 
    public int getNumScores() { 
     return numOfScores; 
    } 
    public String toString() { 

     String res = ""; 
     DecimalFormat twoDForm = new DecimalFormat("#,###.0#"); 
     DecimalFormat twoEForm = new DecimalFormat("0.0"); 
     res += " Player Name: " + name + "\n Scores: "; 
     for (int i = 0; i < numOfScores; i++) 
     { 
      res += twoDForm.format(scores[i]) + " "; 
     } 
     res += "\n Average Score: "; 
     res += twoEForm.format(this.computeAvgScore()); 
     return res; 
    } 
    public void addScore(double scoreIn) { 
     double newScores[] = new double[numOfScores +1 ]; 
     for (int i = 0; i < numOfScores; i++) 
     { 
      newScores[i] = scores[i]; 
     } 
     scores = new double[numOfScores + 1]; 
     for(int i = 0; i < numOfScores; i++) 
     { 
      scores[i] = newScores[i]; 
     } 
     scores[numOfScores] = scoreIn; 
     numOfScores++; 
    } 
    public boolean deleteScore(double scoreIn) { 
     boolean found = false; 
     int index = 0; 
     for (int i = 0; i < numOfScores; i++) 
     { 
      if (scores[i] == scoreIn) 
      { 
       found = true; 
       index = i; 
      } 
     } 
     if (found == true) 
     { 
      double newScores[] = new double[numOfScores -1 ]; 
      for (int i = 0; i < index; i++) 
      { 
       newScores[i] = scores[i]; 
      } 
      for (int i = index + 1; i < numOfScores; i++) 
      { 
       newScores[i - 1] = scores[i]; 
      } 
      scores = new double[numOfScores - 1]; 
      numOfScores--; 
      for (int i = 0; i < numOfScores; i++) 
      { 
       scores[i] = newScores[i]; 
      } 
      return true; 
     } 
     else 
     { 
      return false; 
     } 


    } 
    public void increaseScoresCapacity() 
    { 
     scores = new double[numOfScores + 1]; 
     numOfScores++; 
    } 
    public double findLowestScore() { 
     double res = 100.0; 
     for (int i = 0; i < numOfScores; i++) 
     { 
      if (scores[i] < res) 
      { 
       res = scores[i]; 
      } 
     } 
     return res; 
    } 
    public double findHighestScore() { 
     double res = 0.0; 
     for (int i = 0; i < numOfScores; i++) 
     { 
      if (scores[i] > res) 
      { 
       res = scores[i]; 
      } 
     } 
     return res; 
    } 
    public double computeAvgScore() { 
     double res = 0.0; 
     if (numOfScores > 0) { 
      for (int i = 0; i < numOfScores; i++) 
     { 
       res += scores[i]; 
      } 
      return res/(double)(numOfScores); 
     } 
     else { 
     //res = 0.0; 
     return res; 
     } 
    } 

} 

回答

4

您的程序調用System.exit(0)某些輸入。不要這樣做!這正是消息告訴你的:在評分代碼完成之前,JVM在文本中間退出。不要致電exit(),只需使用return即可早點返回main()

+0

好悲傷!承認我浪費在這個小問題上的時間令人尷尬。你的時間非常感謝! – user2092509 2013-03-18 03:16:59

+0

這是我在現實生活中可能遇到的問題,還是僅僅是一個自動評分問題?似乎退出該計劃是我在該計劃的關鍵時刻想要做的事情? – user2092509 2013-03-18 03:18:19

+0

當你在現實生活中調用'exit()'時,你確實必須小心。如果你自己寫了'main()',那就去做吧,因爲你已經掌握了。另一方面,如果你正在寫一個與掃描器對話的庫(僅僅是一個例子),那麼該庫永遠不會更好,因爲你不知道什麼類型的程序可能會被調用'exit()'給你打電話。如果我使用你的圖書館,並且我的程序神祕地退出,我將不會高興! – 2013-03-18 03:21:56