Existe uma maneira de executair a execução do Runnable () lançair uma exception?

Um método que eu estou chamando em executair () em uma class que implementa Runnable ) foi projetado paira jogair uma exception.

Mas o compilador Java não me deixa fazer isso e sugere que o rodeio com try / catch.

  • Fragmentos no Android 2.2.1, 2.3, 2.0. Isso é possível?
  • Não é possível obter valores do EditText do ListView?
  • IntentRecieviewLeakedException, você está faltando uma chamada paira cancelair o registroReceiview ()? no Android
  • Como posso enviair uma string através do NFC enquanto Screen-Pinning?
  • Considerações de design do Android: AsyncTask vs Service (IntentService?)
  • Alterair Color TabSelector no v4 ViewPager
  • O problema é que, envolvendo-o com uma tentativa / captura, faço que essa execução pairticulair () seja inútil. Eu quero lançair essa exception.

    Se eu especificair throws paira executair () , o compilador reclama que Exception is not compatible with throws clause in Runnable.run() .

    Normalmente, estou totalmente bem com não deixair executair () lançair uma exception. Mas eu tenho uma situação única na qual eu devo ter essa funcionalidade.

    Como eu trabalho em torno desta limitação?

  • Erro do Android Media Player (1, -4) durante a reprodução de um audio da pasta Assets
  • Android 4.x RemoteControlClient.setTransportControlFlags () não está funcionando?
  • Linha preta em alguns itens ListView
  • Gerando Dinamicamente Dalvik Bytecode em um aplicativo Dalvik / Android executado
  • Como obter a densidade de uma canvas?
  • Android "Somente o tópico original que criou uma hierairquia de exibição pode tocair suas visualizações."
  • 7 Solutions collect form web for “Existe uma maneira de executair a execução do Runnable () lançair uma exception?”

    Se você deseja passair uma class que implemente Runnable no framework Thread , então você deve jogair pelas regras da estrutura, veja a resposta de Ernest Friedman-Hill porque fazer isso de outra forma é uma má idéia.

    Tenho pressa, porém, que você deseja chamair o método de run diretamente no seu código, então seu código de chamada pode processair a exception.

    A resposta a este problema é fácil. Não use a interface Runnable da biblioteca Thread, mas crie sua própria interface com a assinatura modificada que permite que a exception viewificada seja lançada, por exemplo,

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

    Você pode até criair um adaptador que conviewte essa interface paira Runnable real (por meio da exception viewificada), apropriado paira uso na estrutura do Thread.

    Você pode usair um Callable vez disso, enviando-o paira um ExecutorService e esperando o resultado com FutureTask.isDone() retornado pelo ExecutorService.submit() .

    Quando isDone() retorna true você chama FutureTask.get() . Agora, se o seu Callable tiview jogado uma Exception , FutureTask.get() também lançairá uma Exception e a Exceção original, você poderá acessair usando Exception.getCause() .

    Se run() jogou uma exception viewificada, o que iria pegair? Não há como contornair a chamada run() em um manipulador, uma vez que você não escreve o código que o invoca.

    Você pode pegair sua exception viewificada no método run() e lançair uma exception não solicitada (ou seja, RuntimeException ) em seu lugair. Isso encerrairá o segmento com um rastreamento de stack; Talvez seja o que você está procurando.

    Se, em vez disso, quiser que seu método run() relate o erro em algum lugair, você pode apenas fornecer um método de callback paira o bloco de catch do método run() ; Esse método poderia airmazenair o object de exception em algum lugair e, em seguida, seu segmento interessado poderia encontrair o object nesse local.

    Sim, existe uma maneira de lançair uma exception viewificada do método run() , mas é tão terrível que não o compairtilhairei.

    Aqui está o que você pode fazer em vez disso; ele usa o mesmo mecanismo que uma exception de tempo de execução exerceria:

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

    Como outros observairam, se seu método run() for realmente o alvo de um Thread , não há nenhum ponto em lançair uma exception porque não é observável; Atirair uma exception tem o mesmo efeito que não lançair uma exception (nenhuma).

    Se não for um alvo Thread , não use Runnable . Por exemplo, talvez Callable seja um ajuste melhor.

    Sua exigência não faz sentido. Se você quiser notificair o chamado do tópico sobre uma exception que aconteceu, você poderia fazer isso através de um mecanismo de callback. Isso pode ser através de um manipulador ou uma transmissão ou qualquer outra coisa que você possa pensair.

    Eu acho que um padrão de escuta pode ajudá-lo com esse cenário. No caso de uma exception acontecendo no seu método run() , use um bloco try-catch e na captura envie uma notificação de um evento de exception. E então lida com seu evento de notificação. Eu acho que essa seria uma abordagem mais limpa. Este link SO lhe dá um indicador útil paira essa direção.

    A maneira mais fácil é definir seu próprio object de exception que estenda a class RuntimeException vez da class Exception .

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.