3

我将此代码提交给了 KATTIS 在线代码测试器。它应该返回重复给出的两个数字的差,直到它达到 EOF。它在 Eclipse 中工作得很好,但 KATTIS 说“未捕获异常”。我希望对没有捕获到哪些异常有所帮助。

提供了导入和类“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();
    }
}
4

3 回答 3

1

请通过添加 try/catch 来修改您的 main(),如下所示:

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(); }
}

通常你会想要更多的本地化异常处理,但这至少允许你复制粘贴堆栈跟踪,以便我们可以看到它。

于 2012-02-15T07:51:55.517 回答
1

只是一个猜测。

在您的代码中查找具有不同类型数据的异常。如果一行非整数,您的程序将终止。它可能应该寻找下一个令牌?

于 2012-02-15T07:03:03.613 回答
0

我不熟悉 Kattis 在线代码测试器,但假设它会检查可能抛出的未检查异常(未捕获的检查异常会导致代码无法编译)。我在代码中看不到检查下一个标记是否为整数的任何地方,因此如果 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;
}

据推测,代码测试人员仍然会抱怨,因为它抛出了另一个(更用户友好的)异常:-)

于 2012-02-15T09:24:00.403 回答