2015-10-18 128 views
-3

我想解決本網站上的問題:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=979。但我的代碼的一部分引發運行時錯誤:Java 1.7運行時錯誤

class Main { 

static String ReadLn (int maxLg) // utility function to read from stdin 
{ 
    byte lin[] = new byte [maxLg]; 
    int lg = 0, car = -1; 
    String line = ""; 

    try 
    { 
     while (lg < maxLg) 
     { 
      car = System.in.read(); 
      if ((car < 0) || (car == '\n')) break; 
      lin [lg++] += car; 
     } 
    } 
    catch (IOException e) 
    { 
     return (null); 
    } 

    if ((car < 0) && (lg == 0)) return (null); // eof 
    return (new String (lin, 0, lg)); 
} 

public static void main(String[] args){ 
    Main jollyJumper = new Main(); 
    jollyJumper.start(); 
} 

public void start(){ 

    String input; 
    while((input = ReadLn(3000)) != null){ 
     System.out.println(answer(input)); 
    } 
} 

public String answer(String line){ 
    // The error comes from this function !!! 
    String[] items = line.split(" "); 
    int[] array; 
    try { 
     array = new int[items.length - 1]; 
    } 
    catch(NegativeArraySizeException e){ 
     return "Not jolly"; 
    } 

    for(int i = 0; i < array.length; i++){ 
     array[i] = Integer.parseInt(items[i +1]); 
    } 
    return "Jolly"; 

} 
} 

但判斷系統不會告訴我哪裏是錯誤,並在我的電腦上一切工作正常。有任何想法嗎?

+1

請告訴我們堆棧跟蹤 – user

+0

沒有足夠的代碼來告訴你程序在哪裏出錯。它會很容易崩潰。請提供isJolly()。 – laune

+0

@user:該站點的在線判斷系統不提供堆棧跟蹤,它實際上只提供字符串「運行時錯誤」。 –

回答

1

這段代碼崩潰的一個簡單原因將是一行中包含多個空格的輸入行。通過修剪陣列並分割一系列空白字符來防止這種情況發生。

String[] items = line.split("\\s+").trim(); 

由於它是,兩個空間連續產生轉換誤差:

java.lang.NumberFormatException: For input string: "" 

編輯在Q.實質性編輯

另一個錯誤後(根據規格)正在使用

byte[3000] 

用於讀取行tha t可以包含一個計數和多達3000個整數。即使只有一半的整數必然要求超過3000個字符或字節。只需使用掃描儀。

最後方法answer沒有解決問題。它只是轉換數字,但需要的處理 - 檢查連續的數字相差不超過一個限制,從1到極限的所有值都存在 - 沒有完成。