2013-06-29 4 views
-2

Этот код ниже - заголовок и тело метода, но я получаю следующую ошибку: no exception of type object can be thrown an exception type must be a subclass of Throwable. Я пытаюсь выполнить этот блок кода: catch(Object object).Ошибка объекта Catch объекта Java

public void method15665(Class435 class435, int i) { 
    do { 
     try { 
      try { 
       byte[] is 
         = new byte[(int) class435.method7563(1085678935)]; 
       int i_3_; 
       for (int i_4_ = 0; i_4_ < is.length; i_4_ += i_3_) { 
        i_3_ = class435.method7564(is, i_4_, is.length - i_4_, 
          (byte) -10); 
        if (i_3_ == -1) 
         throw new EOFException(); 
       } 
       Class224_Sub8 class224_sub8 = new Class224_Sub8(is); 
       if ((class224_sub8.aByteArray8535.length 
         - class224_sub8.anInt8536 * 475822179) 
         < 1) { 
        try { 
         class435.method7572(-1683167102); 
        } catch (Exception exception) { 
      /* empty */ 
        } 
        break; 
       } 
       int i_5_ = class224_sub8.method13859((short) -7287); 
       if (i_5_ < 0 || i_5_ > 1) { 
        try { 
         class435.method7572(-1683167102); 
        } catch (Exception exception) { 
      /* empty */ 
        } 
        break; 
       } 
       if ((class224_sub8.aByteArray8535.length 
         - class224_sub8.anInt8536 * 475822179) 
         < 2) { 
        try { 
         class435.method7572(-1683167102); 
        } catch (Exception exception) { 
      /* empty */ 
        } 
        break; 
       } 
       int i_6_ = class224_sub8.method13737(2071056893); 
       if ((class224_sub8.aByteArray8535.length 
         - 475822179 * class224_sub8.anInt8536) 
         < 6 * i_6_) { 
        try { 
         class435.method7572(-1683167102); 
        } catch (Exception exception) { 
      /* empty */ 
        } 
        break; 
       } 
       for (int i_7_ = 0; i_7_ < i_6_; i_7_++) { 
        Class323 class323 
          = Class399.aClass195_Sub2_Sub1_5932 
          .method14614(class224_sub8, -2141543778); 
        if ((Class255.aClass255_3016 
          == (((Class173_Sub1) this).aClass255Array9960 
          [class323.anInt5015 * 1568411443])) 
          && (Class399.aClass195_Sub2_Sub1_5932.method14624 
          (class323.anInt5015 * 1568411443, 82620551) 
          .aClass350_2171.method6687 
            (-1035085164).aClass5162.isAssignableFrom 
            (class323.anObject5014.getClass()))) 
         anInterface50_2149.method298((class323.anInt5015 
           * 1568411443), 
           class323.anObject5014, 
           -1250481088); 
       } 
      } catch (Exception exception) { 
       try { 
        class435.method7572(-1683167102); 
       } catch (Exception exception_8_) { 
        exception = exception_8_; 
       } 
       break; 
      } 
      try { 
       class435.method7572(-1683167102); 
      } catch (Exception exception) { 
     /* empty */ 
      } 
     } catch (Object object) { 
      try { 
       class435.method7572(-1683167102); 
      } catch (Exception exception) { 
     /* empty */ 
      } 
      throw object; 
     } 
    } while (false); 
} 

Кто-нибудь знает, как это исправить? Это было бы очень признательно!

+4

wow, некоторые запоминающиеся методы и имена классов – alex

+2

это декомпилированный java-файл класса, который запутывался раньше? –

ответ

2

заменить

} catch (Object object) { 

с

} catch (Throwable object) { 

на самом деле вы не хотите, чтобы поймать Throwable, но, вероятно, Exception, RuntimeException или еще более конкретный класс.

+0

Почему бы не «Throwable»? Совершенно законно, если вы хотите вызвать этот метод в случае какой-либо ошибки (что является очень типичным требованием). –

+2

@MarkoTopolnik catching Throwable, как правило, плохая идея, потому что ошибки не предназначены для улова. Когда возникает ошибка, вы не можете быть уверены в чем-либо. Возможно, классы отсутствуют, или вы потеряли память.Конечно, есть исключения из правила. –

+0

Скорее, это обычный случай. Если вы не согласны, просто просмотрите любые публичные библиотеки, такие как Spring, Swing или SWT, которые содержат основные циклы или основные контексты обработки запросов. Все, неизменно, ловят «Throwable», выполняют некоторую очистку и проглатывают исключение. –

0

Все исключения и ошибки распространяются Throwable, только те могут быть брошены и пойманы.

Вы можете сделать

try{ 
    throw new Exception(); 
    }catch(Exception e){ 
    // something here 
    }catch(Throwable t){ 
    // something here 
    } 

Когда вы пишете несколько блоков поймать, а затем сохранить в виду следующее

  • Вы не можете написать тип подкласса ПОСЛЕ суперкласса типа. т. е. если вы напишете catch(RuntimeException rt){} ПОСЛЕ catch(Exception e){}, то вы получите ошибку компилятора, которую он уже поймал.
2

Вы можете только поймать, что может быть выброшен (IS-A Throwable). Следовательно, компилятор жалуется, когда вы пытаетесь поймать объект Объект (потому что он не распространяется Throwable).

catch (Object o) // Error: Object IS-NOT Throwable 

Throwable наследуется всеми видами Error с и Exception с. Но мы обычно не поймаем Error s, потому что программа почти всегда не может оправиться от него, например, OutOfMemoryError. Таким образом, catch (Throwable t)не рекомендуется.

При использовании catch (Exception e) вы в основном имеют всеохватывающий для любого исключения (проверяется или ООН проверил), которые могли бы быть выброшены во время бега. Использовать или не использовать общий улов обычно зависит от того, что вы делаете, try. Например, при чтении файла вы хотели бы обрабатывать и отвечать на FileNotFoundException иначе, чем сказать EOFException.

Смежные вопросы