Как мне объявить исключение в анонимном потоке? - PullRequest
2 голосов
/ 01 июля 2011
InputStream in = ClientSocket.getInputStream();
new Thread()
{
    public void run() {
        while (true)
        {
            int i = in.read();
            handleInput(i);
        }
    }
}.start();

Я слушаю новые данные в сокете с этим кодом и получаю:

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

Когда я добавляю ", выдает IOException " после "run ()"Я получаю:

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 {
                    ^

Возможно, это что-то простое, но я в растерянности.Как мне пройти это?

Ответы [ 6 ]

5 голосов
/ 01 июля 2011

Вы не можете переопределить интерфейс Runnable.run () , который не вызывает исключение. Вместо этого вы должны обработать исключение в методе run.

try {
  int i = in.read();
} catch (IOException e) {
  // do something that makes sense for your application
}
1 голос
/ 01 июля 2011

Вместо этого используйте java.util.concurrent.Callable<V>:

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

Вы можете вызвать get () на будущее, если хотите иметь дело с результатом Callable.Будет выброшено любое исключение, которое бросил Callable.

1 голос
/ 01 июля 2011

Вы не можете "передать" исключение, так как этот код выполняется в другом потоке. Где это будет поймано? Исключения не являются асинхронными событиями, они представляют собой структуру управления потоком. Вы можете попробовать / поймать его в методе запуска.

1 голос
/ 01 июля 2011

Вы не можете - метод run() в Thread просто не может генерировать непроверенные исключения.Это на самом деле не имеет ничего общего с анонимными классами - вы получите то же самое, если попытаетесь напрямую расширить Thread.

Вам нужно решить, что вы хотите, чтобы произошло в случае возникновения этого исключения,Вы хотите, чтобы это убило нить?Сообщаться как-нибудь?Рассмотрим использование непроверенных исключений, обработчиков верхнего уровня и т. Д.

0 голосов
/ 01 июля 2011

Вам нужно обработать исключение или перебросить как исключение без проверки.

InputStream in = ClientSocket.getInputStream();
new Thread() {
  public void run() {
    try {
      while (true) {
        int i = in.read();
        handleInput(i);
      }
    } catch (IOException iox) {
      // handle, log or wrap in runtime exception
    }
  }
}.start();
0 голосов
/ 01 июля 2011

Вы пробовали использовать попытку / поймать? Вы можете получить это исключение просто потому, что не поступает постоянный поток.

...