e ist effektiv endgültig.
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;
}
}
Wenn Sie jedoch eine einzelne Ausnahme anstelle einer Mehrfachausnahme abfangen, können Sie die abgefangene Ausnahme und ihre Unterklassen neu zuweisen.
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;
}
}
Im folgenden Beispiel ist die im Lambda-Ausdruck verwendete lokale Variable effektiv endgültig und beim Neuzuweisen tritt ein Kompilierungsfehler auf.
public interface Greeting {
void sayHi(String name);
}
String name = "Ken";
Greeting g = n -> System.out.println("Hi, " + name);
name = "Taro"; //★ Fehler hier kompilieren
g.sayHi(name);
try-with-resources
JDBC-Beispiel, das praktisch nicht endgültig ist, aber nicht neu zugewiesen werden kann
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();
}
Übrigens ist es mit einem normalen Try-Catch möglich
try {
connection = DriverManager.getConnection("url");
} catch (SQLException e) {
e.printStackTrace();
}
Recommended Posts