2 Stimmen

Wie kann ich eine Ausnahme in einem anonymen Thread deklarieren?

InputStream in = ClientSocket.getInputStream();
new Thread()
{
    public void run() {
        while (true)
        {
            int i = in.read();
            handleInput(i);
        }
    }
}.start();

Ich höre mit diesem Code auf neue Daten auf einem Socket und erhalte:

FaceNetChat.java:37: unreported exception java.io.IOException; must be caught or declared to be thrown
                int i = in.read();
                               ^

Wenn ich " throws IOException " nach dem " run() " Ich verstehe:

FaceNetChat.java:34: run() in  cannot implement run() in java.lang.Runnable; overridden method does not throw java.io.IOException
        public void run() throws IOException {
                    ^

Wahrscheinlich ist es etwas Einfaches, aber ich bin ratlos. Wie kann ich das umgehen?

5voto

sudocode Punkte 15987

Sie können nicht die Schnittstelle von Runnable.run() die keine Ausnahme auslöst. Stattdessen müssen Sie die Ausnahme in der Run-Methode behandeln.

try {
  int i = in.read();
} catch (IOException e) {
  // do something that makes sense for your application
}

1voto

Jon Skeet Punkte 1325502

Das können Sie nicht - die run() Methode in Thread können einfach keine ungeprüften Ausnahmen auslösen. Das hat wirklich nichts mit anonymen Klassen zu tun - Sie würden das Gleiche bekommen, wenn Sie versuchen würden, die Thread direkt.

Sie müssen sich überlegen, was passieren soll, wenn diese Ausnahme eintritt. Wollen Sie, dass der Thread beendet wird? Irgendwie gemeldet werden? Erwägen Sie die Verwendung von ungeprüften Ausnahmen, Top-Level-Handlern usw.

1voto

James Scriven Punkte 7198

Sie können die Ausnahme nicht "weitergeben", da dieser Code in einem anderen Thread ausgeführt wird. Wo würde sie abgefangen werden? Ausnahmen sind keine asynchronen Ereignisse, sondern eine Flusskontrollstruktur. Sie könnten es in der Run-Methode versuchen/abfangen.

1voto

artbristol Punkte 31293

Utilice java.util.concurrent.Callable<V> stattdessen:

    final Callable<Integer> callable = new Callable<Integer>() {

        @Override
        public Integer call() throws Exception {
            ... code that can throw a checked exception ...
        }
    };
    final ExecutorService executor = Executors.newSingleThreadExecutor();
    final Future<Integer> future = executor.submit(callable);
    try {
        future.get();
    } finally {
        executor.shutdown();
    }

Sie können get() für die Zukunft aufrufen, wenn Sie mit dem Ergebnis der Callable . Es wird jede Ausnahme ausgelöst, die der Callable geworfen.

0voto

Mitch Salopek Punkte 21

Haben Sie versucht, ein Try/Catch zu verwenden? Möglicherweise erhalten Sie diese Ausnahme nur, weil kein konstanter Stream eingeht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X