3

Я действительно хочу использовать функции Java-1.7. Одна из этих функций - «Multi-Catch». В настоящее время у меня есть следующий кодНевозможно использовать Multi Catch от Java Эффективно

try { 
    int Id = Integer.parseInt(idstr); 

    TypeInfo tempTypeInfo = getTypeInfo(String.valueOf(Id)); 

    updateTotalCount(tempTypeInfo); 
} catch (NumberFormatException numExcp) { 
    numExcp.printStackTrace(); 
} catch (Exception exception) { 
    exception.printStackTrace(); 
} 

Я хочу, чтобы удалить два улова блоков из приведенного выше кода, и вместо того, чтобы использовать единственный улов, как показано ниже:

try { 
    int Id = Integer.parseInt(idstr); 

    TypeInfo tempTypeInfo = getTypeInfo(String.valueOf(Id)); 

    updateTotalCount(tempTypeInfo); 
} catch (Exception | NumberFormatException ex) { // --> compile time error 
    ex.printStackTrace(); 
} 

Но приведенный выше код дает компиляции ошибки времени :

"NumberFormatException" is already caught by the alternative Exception.

Я понял приведенную выше ошибку времени компиляции, но какова замена для моего первого блока кода.

ответ

5

NumberFormatException является подклассом Exception. Говоря, что оба блока catch должны иметь такое же поведение, как сказать, что у вас нет специальной обработки для NumberFormatException, просто такое же общее лечение у вас есть для Exception. В этом случае, вы можете просто пропустить его catch блока и только catch Exception:

try { 
    int Id = Integer.parseInt(idstr); 

    TypeInfo tempTypeInfo = getTypeInfo(String.valueOf(Id)); 

    updateTotalCount(tempTypeInfo); 
} catch (Exception exception) { 
    exception.printStackTrace(); 
} 
0

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

1

вы можете использовать

try { 
    int Id = Integer.parseInt(idstr); 

    TypeInfo tempTypeInfo = getTypeInfo(String.valueOf(Id)); 

    updateTotalCount(tempTypeInfo); 
    } catch (Exception exception) { 
    exception.printStackTrace(); 
    } 
+0

Спасибо за изменения @Am_I_Helpful. В духе сделанного вами редактирования, You_are_helpful :) – Prashant

+0

Спасибо, что признал меня «You_are_helpful»! Еще раз спасибо.И +1 –

1

Типы в многоканальном прилов должен быть не пересекаются и java.lang.NumberFormatException подкласс java.lang.Exception.

1

Компилятор говорит вам, что

} catch (Exception ex) { 

также поймать NumberFormatException исключения, потому что java.lang.NumberFormatException расширяет java.lang.IllegalArgumentException, которая простирается java.lang.RuntimeException, что в конечном итоге увеличивает java.lang.Exception.

0

Exception является родительским классом всех исключений и в идеале (предпочтительный подход - наилучшая практика кодирования), вы никогда не должны улавливать Exception, если только вы не уверены, что будет выбрано во время выполнения в блоке try.

Так, в вашем коде вы делаете операцию NumberFormat, который является классом потомка Exception, вы не должны поймать исключение (если 2 других методы не могут бросить непроверенное исключение) и используйте:

try { 
    int Id = Integer.parseInt(idstr); 
    TypeInfo tempTypeInfo = getTypeInfo(String.valueOf(Id));\ 
    updateTotalCount(tempTypeInfo); 
} catch (NumberFormatException npe) { 
    npe.printStackTrace(); 
} 
+0

Спасибо @stategroup, я знаю, что Exception - суперкласс, но во время выполнения я не знаю других типов исключений, вот почему мой код имеет NumberFormatexception (ожидается) и excetpion (неожиданно). –

+0

@ M.S.Naidu. Чтобы ваш код не вызывал никаких других исключений, вы можете проверить другие методы, которые вы вызываете. Если вы не выполняете операций ввода-вывода, класс и т. Д. (Которые могут вызывать исключение RunTime), вам не нужно ломать Exception. Причина, по которой у Java есть другой уровень исключения, позволяет вам иметь прекрасный контроль над вашим кодом. Таким образом, вы можете поймать исключение и выбрать игнорировать его или повторно бросить – Sategroup

0

для того, чтобы добавить к раствору Mureinik в:

Если вы хотите, чтобы дифференцировать обработку ошибок для каждого из подклассов можно использовать instanceof в улов блока что-то вроде:

FileNotFoundException is subclass of IOException 

catch (IOException e) { 
      if (e instanceof FileNotFoundException) 
      { 
       System.out.println("FileNotFoundException"); 
      } 
      else if(e instanceof IOException) 
      { 
       System.out.println("IOException"); 
      } 

     }