2014-01-22 5 views
0

Почему для Eclipse это должно управляться с помощью try-with arm?Java-попытка с предупреждением о ресурсах от Eclipse

BufferedReader reader = null; 
try { 
    if (condition) { 
    try { 
     reader = method1(); 
    } catch (Exception e) { 
     ... 
    } 
    } 
    if (reader == null) { 
    reader = method2(); 
    } 

    do things ... 
} catch(Exception e) { 
    ... 
} finally { 
    if (reader != null) { 
    reader.close(); 
    } 
} 

Существует лучший способ справиться с этим случаем? или просто предупреждение о нежелательном результате затмения?

Этот случай не является действительным:

try (BufferedReader reader = null) { 
    if (condition) { 
    reader = method1(); 
    } else { 
    reader = method2(); 
    } 

    do things ... 
} 
+1

Что вы подразумеваете под 'this case is not valid'? –

+1

Вы знаете, что вы не «поймали» возможное исключение? – Maroun

+0

Какое фактическое предупреждение вы получаете от затмения и где оно размещено? – Pshemo

ответ

1

Try:

try (BufferedReader reader = createBufferedReader(condition)) { 
    do things ... 
} 

private BufferedReader createBufferedReader(boolean condition){ 
    if (condition) { 
    return method1(); 
    } else { 
    return method2(); 
    } 
} 
+0

Это будет действительным, но я не создаю новый метод, чтобы избежать этого предупреждения, кажется, я убил муравья с пистолетом. – Seby

+1

Не следует избегать предупреждения - писать меньше ошибок и более сжатый код. Вот почему вы получаете предупреждение. – Puce

+0

Не быть полемичным, но таким образом, когда я смотрю на первую строку кода, я не знаю, что делает createBufferedReader, чем я должен смотреть на него, а не возвращаться к первому методу. Это, конечно, не более сжатый код, наоборот. (очевидно, имея много кода в do things ... line). – Seby

0

вы можете использовать функцию, которая имеет тип возвращаемого BufferedReader, в котором вы можете использовать свой условный вызов, эта функция может вызывается из основного только в том случае, если выполняется определенная конкретная ситуация, которую вы ищете.

private BufferedReader createReader(!XYZ){ 
if(a>b) 
return abc(); 
else 
return def(); 
} 

public static void main(String[] args){ 
createReader(!XYZ); 
} 
1

Как утверждает Спецификация языка Java в jls-14.20.3

Ресурс, объявленный в ResourceSpecification неявно объявляется окончательный (§4.12.4), если он явно не объявлен окончательным.

Таким образом, вы не можете изменить его в своем блоке try. Если вы хотите изменить его, используйте стандартный блок try-catch-finally. Другим вариантом будет выбор правильного ресурса, прежде чем использовать его с помощью try-with-resources.

+0

Использование стандартного блока try-catch бросает предупреждение. – Seby

+0

@ user509375 Я не могу воспроизвести ваше предупреждение. – Pshemo

0

Лучший способ имхо, ясно и сжато:

final String s = "abc"; 

try (BufferedReader reader = new Callable<BufferedReader>() { 
    @Override 
    public BufferedReader call() throws Exception { 
    if (condition) { 
     return method1(); 
    } 
    return method2(); 

    // different scope, s needs final keyword 
    } 
}.call()) { 

    do things ... 

} catch (Exception e) { 
    ... 
} 

Также проще в Java 8:

String s = "abc"; 

try (BufferedReader reader =() -> { 
    if (condition) { 
    return method1(); 
    } 
    return method2(); 

    // same scope, s does not need final keyword 
}) { 

    do things ... 

} catch (Exception e) { 
    ... 
} 
+0

Вам нужно вызвать 'call()' после анонимного класса Callable. – Pshemo

+0

@Pshemo забыл, отредактировал, спасибо! – Seby

+0

В любом случае ИМХО с использованием 'Callable' здесь использует этот интерфейс неправильно. Я бы предпочел подход Пуче с дополнительным частным методом. Это помешает вам создать окончательные ссылки, чтобы вы могли передать их в анонимный класс «Callable». Также лучше разделить код на короткие части, которые могут поддерживаться отдельно (например, методы). – Pshemo

1

Вам не обязательно нужно отзывной или лямбда-выражение, как в ответ Seby в.

Учитывая, что проблема достаточно проста, вы можете просто использовать тернарный оператор, который работает во всех версиях java.

final String s = "abc"; 

try (BufferedReader reader = (condition) ? method1() : method2();) { 

    do things ... 

} catch (Exception e) { 
    ... 
}