2009-11-25 2 views
12

Скажем, я могу набор операторов:Java: Try-Catch-Continue?

try { 
    String a = getProperty("a"); 
    String b = getProperty("b"); 
    String c = getProperty("c"); 
} catch(Exception e) { 

} 

Теперь, позволяет сказать, что свойство б не был найден, и функция вызывает исключение. В этом случае, как я могу просто продолжить или, возможно, установить b в значение null, не создавая блок try-catch для каждого свойства? Я имею в виду, a, b, c существуют, но иногда они могут вообще не обнаруживаться, в течение которых генерируется исключение.

ответ

19

Предполагая, что вы не можете изменить функцию так, чтобы она возвращала значение null, когда свойство не было найдено, вы как бы застряли в оболочке все в своем собственном блоке catch try - особенно, если вы хотите, чтобы каждое значение, которое может быть извлекаться быть получен (., в отличие от позволяя первое значение, которое не удается отменить всю операцию)

Если у вас есть много этих свойств извлекаемых, возможно, было бы чище, чтобы написать вспомогательный метод для использования:

String getPropertySafely(String key) { 
    try { 
     return getProperty(key); 
    } catch (Exception e) { 
     return null; 
    } 
} 
+0

Это выглядит очень интересно! Спасибо – Legend

+1

Я бы назвал это «getPropertyQuietly» только потому, что они используют это соглашение об именах в Jakarta Commons IO (методы closeQuietly в классе IOUtils) –

+4

+1 Ravi - Главный мой любимый мозоль - это глотание исключений. Если вы собираетесь это сделать, по крайней мере, сделать это очевидным, основываясь на имени метода. (Clean Code) – Elliot

7

Вы должны положить try-catch вокруг каждого утверждения. Нет продолжения (как есть в ON ERROR ... RESUME блоках в VB). Вместо того, чтобы:

String a = null; 
try { 
    a = getProperty("a"); 
} catch(Exception e) { 
    ... 
} 
String b = null; 
try { 
    b = getProperty("b"); 
} catch(Exception e) { 
    ... 
} 
String c = null; 
try { 
    c = getProperty("c"); 
} catch(Exception e) { 
    ... 
} 

вы могли бы написать:

public String getPropertyNoException(String name) { 
    try { 
    return getProperty(name); 
    } catch (Exception e) { 
    return null; 
    } 
} 

Лично я думаю, что getProperty() является плохим кандидатом для метания исключения только для всего этого дополнительного шаблонного требуется

+1

А ... Я думал, что смогу уйти, используя более простой подход. Спасибо .. – Legend

+1

Да, ... что getProperty происходит из другой библиотеки, и я действительно не хотел касаться этой части. – Legend

5

Поскольку вы используете тот же каждый раз, когда вы можете поставить это в петлю:

String[] abc = new String[3]; 
String[] param = {"a", "b", "c"}; 
for (int i = 0; i < 3; i++) { 
    try { 
     abc[i] = getProperty(param[i]); 
    } catch(Exception e) { 

    } 
} 

, но это довольно надуманно и будет полезно только для большого количества свойств. Я подозреваю, что вам придется просто написать 3 try-catch.

3

Вы должны пересмотреть, как обрабатывается getProperty, если вы планируете использовать многие из них, поскольку существует не простой способ сделать это.

Вы можете использовать инструкцию finally, но для каждого вызова вам по-прежнему нужен try-catch.