2012-02-15 120 views
2

我將此代碼提交給KATTIS在線代碼測試器。它應該返回已經重複給出的兩個數字的差值,直到達到EOF。它在日食中效果很好,但是KATTIS說「沒有發現異常」。我希望得到一些幫助,以瞭解哪些例外未被捕獲。Java:未捕獲異常錯誤?

提供了輸入和類「Kattio」,所以輸入和輸出將始終與在線代碼系統一起工作。

import java.util.StringTokenizer; 
import java.io.BufferedReader; 
import java.io.BufferedOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.io.OutputStream; 

class Kattio extends PrintWriter { 
    public Kattio(InputStream i) { 
     super(new BufferedOutputStream(System.out)); 
    r = new BufferedReader(new InputStreamReader(i)); 
    } 
    public Kattio(InputStream i, OutputStream o) { 
     super(new BufferedOutputStream(o)); 
     r = new BufferedReader(new InputStreamReader(i)); 
    } 

    public boolean hasMoreTokens() { 
     return peekToken() != null; 
    } 

    public int getInt() { 
     return Integer.parseInt(nextToken()); 
    } 

    private BufferedReader r; 
    private String line; 
    private StringTokenizer st; 
    private String token; 

    private String peekToken() { 
    if (token == null) 
     try { 
     while (st == null || !st.hasMoreTokens()) { 
      line = r.readLine(); 
      if (line == null) return null; 
      st = new StringTokenizer(line); 
     } 
     token = st.nextToken(); 
     } catch (IOException e) { } 
    return token; 
    } 

    private String nextToken() { 
    String ans = peekToken(); 
    token = null; 
    return ans; 
    } 
} 

public class Hello { 

    public static void main(String[] args) { 
     Kattio io = new Kattio(System.in, System.out); 

     while (io.hasMoreTokens()){ 
      int n1 = io.getInt(); 
      int n2 = io.getInt(); 
      if (n1>n2){ 
       io.println(n1-n2); 
      } 
      else if (n2>n1){ 
       io.println(n2-n1); 
      } 
      else { 
       io.println("0"); 
      } 
     } 
     io.close(); 
    } 
} 

回答

1

只是一個猜測。

在您的代碼中查找具有不同類型數據的異常。如果一個非整數的行會終止你的程序。它應該可能尋找下一個令牌?

1

請修改您的main()加入try/catch語句,像這樣:

public static void main(String[] args) { 
try { 
    Kattio io = new Kattio(System.in, System.out); 

    while (io.hasMoreTokens()){ 
     int n1 = io.getInt(); 
     int n2 = io.getInt(); 
     if (n1>n2){ 
      io.println(n1-n2); 
     } 
     else if (n2>n1){ 
      io.println(n2-n1); 
     } 
     else { 
      io.println("0"); 
     } 
    } 
    io.close(); 
} catch(Exception e) { e.printStackTrace(); } 
} 

通常你會希望有更多本地化的異常處理,但這將至少讓你複製粘貼我們的堆棧跟蹤所以我們可以看到它。

0

我不熟悉Kattis在線代碼測試器,但假設它檢查可能引發的未檢查異常(未檢測到的異常會導致代碼不能編譯)。我看不到代碼中檢查下一個標記是Integer的任何地方,因此如果Integer.parseInt試圖解析非整數的東西,它將引發NumberFormatException。根據應用程序的受衆,您可以保持原樣(如果受衆是會理解該異常的Java開發人員),或者抓住它重新引發更友好的用戶界面(如果他們不是這樣)。

public int getInt() { 
     // not tested 
     int nextInt; 
     try { 
       nextInt = Integer.parseInt(nextToken()); 
     } catch (NumberFormatException nfe) { 
       throw new RuntimeException("Invalid number in file"); 
     } 
     return nextInt; 
} 

大概雖然,代碼測試儀仍然會抱怨,雖然,因爲它的投擲另一個(更加人性化)異常:-)