Java: ошибка Uncaught Exception? - PullRequest
       17

Java: ошибка Uncaught Exception?

3 голосов
/ 15 февраля 2012

Я отправил этот код в онлайн-тестировщик кода 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 ]

1 голос
/ 15 февраля 2012

Пожалуйста, измените ваш 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(); }
}

Обычно вы хотите более локализованную обработку исключений, но это по крайней мере позволит вам скопировать и вставить намstacktrace , чтобы мы могли его видеть.

1 голос
/ 15 февраля 2012

просто предположение.

Ищите исключения в своем коде с различными типами данных. Если строка не является целым числом, ваша программа завершится. Стоит ли искать следующий токен?

0 голосов
/ 15 февраля 2012

Я не знаком с онлайн-тестером кода 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;
}

Предположительно, тем не менее, тестер кода все равно будет жаловаться, поскольку он вызывает другое (более удобное для пользователя) исключение: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...