e est effectivement définitif.
public static void main(String[] args) throws IOException{
try{
throw new IOException();
}catch (RuntimeException | IOException e){
e = new RuntimeException(); // Cannot assign a value to final variable 'e'
throw e;
}
}
Cependant, lorsque vous interceptez une seule exception au lieu de plusieurs, vous pouvez réaffecter l'exception interceptée et ses sous-classes.
static class FooException extends Exception{}
static class BarException extends FooException{}
public static void main(String[] args) throws FooException{
try{
throw new FooException();
}catch (FooException fe){
fe = new FooException();
fe = new BarException();
throw fe;
}
}
Dans l'exemple ci-dessous, les variables locales utilisées dans l'expression lambda sont effectivement finales, ce qui entraîne une erreur de compilation lors de la réaffectation.
public interface Greeting {
void sayHi(String name);
}
String name = "Ken";
Greeting g = n -> System.out.println("Hi, " + name);
name = "Taro"; //★ Erreur de compilation ici
g.sayHi(name);
try-with-resources
Exemple JDBC qui n'est pratiquement pas définitif mais qui ne peut pas être réaffecté
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
Connection connection = null;
try (connection = DriverManager.getConnection("url") { // unknown class "connection"
} catch (SQLException e) {
e.printStackTrace();
}
Au fait, c'est possible avec un try-catch normal
try {
connection = DriverManager.getConnection("url");
} catch (SQLException e) {
e.printStackTrace();
}
Recommended Posts