Intereting Posts
Android: обнаружение, если пользователь коснется и перетащит из области кнопки? Как избежать дублирования имени контакта (данных) при загрузке контактной информации в listview? Телефонная клавиатура Android-клавиатура охватывает прокрутку элементов ввода, отключена Значения «доверия» Android SpeechRecognizer запутывают Android: findviewbyid: поиск вида по id, когда представление не находится на том же макете, который вызывается setContentView Отключение EditText в android ImageButton в Android с прозрачным фоном Фоновый оттенок Lollipop не влияет на кнопку Как изменить положение счетчика в соответствии с положением другого счетчика в двух разных действиях Использование службы Google Play Services LocationClient в фоновом режиме Поверните маркер и переместите анимацию на карту, например, Uber Android Android Studio: не удалось найти com.android.tools.build:gradle:2.0.0-alpha2 Вход в Google Android с Firebase – statusCode DEVELOPER_ERROR Android с maven? Apk unknown Вызов метода удаления в пользовательском контенте

Есть ли способ сделать Runnable run () для исключения?

Метод, который я вызываю в run () в классе, который реализует Runnable ), предназначен для исключения исключений.

Но компилятор Java не позволит мне это сделать и предлагает, чтобы я окружал его с помощью try / catch.

Проблема в том, что, окружив его try / catch, я делаю этот конкретный run () бесполезным. Я хочу бросить это исключение.

Если я укажу throws для run () , компилятор жалуется, что Exception is not compatible with throws clause in Runnable.run() .

Обычно я полностью в порядке, не позволяя run () выдавать исключение. Но у меня есть уникальная ситуация, в которой у меня должна быть эта функциональность.

Как мне обойти это ограничение?

Solutions Collecting From Web of "Есть ли способ сделать Runnable run () для исключения?"

Если вы хотите передать класс, который реализует Runnable в структуре Thread , тогда вы должны играть по правилам этой структуры, см. Ответ Эрнеста Фридмана-Хилла, почему делать это в противном случае – плохая идея.

Однако у меня есть подозрение, что вы хотите вызвать метод run непосредственно в вашем коде, поэтому ваш код вызова может обрабатывать исключение.

Ответ на эту проблему прост. Не используйте интерфейс Runnable из библиотеки Thread, но вместо этого создайте свой собственный интерфейс с модифицированной сигнатурой, которая позволяет исключить проверенное исключение, например

 public interface MyRunnable { void myRun ( ) throws MyException; } 

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

Callable этого вы можете использовать Callable , отправив его в ExecutorService и ожидая результата с помощью FutureTask.isDone() возвращаемого ExecutorService.submit() .

Когда isDone() возвращает true, вы вызываете FutureTask.get() . Теперь, если ваша Callable Exception тогда FutureTask.get() выведет Exception и исходное исключение, с которым вы сможете получить доступ, используя Exception.getCause() .

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

Вы можете поймать выбранное исключение в методе run() и выбросить на место исключенное исключение (т. RuntimeException ). Это приведет к завершению потока с трассировкой стека; Возможно, это то, что вам нужно.

Если вместо этого вы хотите, чтобы ваш метод run() сообщал о ошибке где-то, вы можете просто предоставить метод обратного вызова для блокирования catch метода метода run() для вызова; Этот метод может хранить объект исключения где-то, а затем ваш заинтересованный поток может найти объект в этом месте.

Да, есть способ выбросить проверенное исключение из метода run() , но это так ужасно, что я не буду делиться им.

Вот что вы можете сделать; Он использует тот же механизм, что и исключение во время выполнения:

 @Override public void run() { try { /* Do your thing. */ ... } catch (Exception ex) { Thread t = Thread.currentThread(); t.getUncaughtExceptionHandler().uncaughtException(t, ex); } } 

Как отмечали другие, если ваш метод run() действительно является объектом Thread , нет смысла бросать исключение, потому что оно ненаблюдаемо; Бросание исключения имеет тот же эффект, что и исключение исключения (none).

Если это не цель Thread , не используйте Runnable . Например, возможно, Callable лучше подходит.

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

Я думаю, что шаблон слушателя может помочь вам в этом сценарии. В случае возникновения исключения в вашем методе run() используйте блок try-catch и в catch поймите уведомление о событии исключения. А затем обработайте ваше уведомление. Я думаю, что это был бы более чистый подход. Эта ссылка SO дает вам полезный указатель на это направление.

Самый простой способ – определить свой собственный объект исключения, который расширяет класс RuntimeException вместо класса Exception .