Java:未捕获的异常错误?

时间:2012-02-15 06:40:14

标签: java uncaught-exception

我将此代码提交给KATTIS在线代码测试人员。它应该返回重复给出的两个数字的差值,直到达到EOF。它在日食中运行得很好,但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();
    }
}

3 个答案:

答案 0 :(得分:1)

只是一个猜测。

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

答案 1 :(得分: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(); }
}

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

答案 2 :(得分: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;
}

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