【问题标题】:Java: Uncaught Exception Error?Java:未捕获的异常错误?
【发布时间】:2012-02-15 06:40:13
【问题描述】:

我将此代码提交给了 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();
    }
}

【问题讨论】:

    标签: java uncaught-exception


    【解决方案1】:

    只是猜测。

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

    【讨论】:

      【解决方案2】:

      请通过添加 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(); }
      }
      

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

      【讨论】:

        【解决方案3】:

        我不熟悉 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;
        }
        

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

        【讨论】:

          猜你喜欢
          • 2014-08-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-25
          • 2012-10-26
          • 2013-07-07
          • 2020-05-30
          相关资源
          最近更新 更多