2012-02-15 16 views
2

私はこのコードをKATTISオンラインコードテスターに​​提出しました。それは、EOFに達するまで繰り返し与えられた2つの数字の違いを返すことになっています。それは日食でうまく動作しますが、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; 
} 

はおそらくしかし、コードのテスターはまだ文句を言うでしょう

関連する問題