Je ne comprends pas exactement comment fonctionne return
dans try
, catch
.
try
et finally
sans catch
, je peux mettre return
à l'intérieur du bloc try
.try
, catch
, finally
, je ne peux pas mettre return
dans le bloc try
.catch
, je dois mettre la return
en dehors des blocs try
, catch
, finally
.catch
et le throw Exception
, je peux mettre le return
dans le bloc try
.Comment fonctionnent-ils exactement? Pourquoi je ne peux pas mettre return
dans le bloc try
?
Code avec try
, catch
, finally
public int insertUser(UserBean user) {
int status = 0;
Connection myConn = null;
PreparedStatement myStmt = null;
try {
// Get database connection
myConn = dataSource.getConnection();
// Create SQL query for insert
String sql = "INSERT INTO user "
+ "(user_name, name, password) "
+ "VALUES (?, ?, ?)";
myStmt = myConn.prepareStatement(sql);
// Set the parameter values for the student
myStmt.setString(1, user.getUsername());
myStmt.setString(2, user.getName());
myStmt.setString(3, user.getPassword());
// Execute SQL insert
myStmt.execute();
} catch (Exception exc) {
System.out.println(exc);
} finally {
// Clean up JDBC objects
close(myConn, myStmt, null);
}
return status;
}
Code avec try
, finally
sans catch
public int insertUser(UserBean user) throws Exception {
int status = 0;
Connection myConn = null;
PreparedStatement myStmt = null;
try {
// Get database connection
myConn = dataSource.getConnection();
// Create SQL query for insert
String sql = "INSERT INTO user "
+ "(user_name, name, password) "
+ "VALUES (?, ?, ?)";
myStmt = myConn.prepareStatement(sql);
// Set the parameter values for the student
myStmt.setString(1, user.getUsername());
myStmt.setString(2, user.getName());
myStmt.setString(3, user.getPassword());
// Execute SQL insert
myStmt.execute();
return status;
} finally {
// Clean up JDBC objects
close(myConn, myStmt, null);
}
}
Enfin block sera toujours exécuté même si nous avons capturé l'exception dans catch block ou même notre try block exécuté comme prévu.
alors quand finalement le bloc sera exécuté avec dans le flux ...
si nous avons return statement à l'intérieur du bloc try/catch , alors avant d'exécuter l'instruction de retour finally block sera exécuté (comme pour la fermeture de la connexion ou des E/S)
function returnType process() {
try {
// some other statements
// before returning someValue, finally block will be executed
return someValue;
} catch(Exception ex) {
// some error logger statements
// before returning someError, finally block will be executed
return someError;
} finally {
// some connection/IO closing statements
// if we have return inside the finally block
// then it will override the return statement of try/catch block
return overrideTryCatchValue;
}
}
mais si vous avez return statement dans le finally statement alors il remplacera le retour return dans le bloc try ou catch.
Il s'agit d'un flux de programme normal lorsque la gestion des exceptions est impliquée. Avoir un bloc catch dans le code crée un cas où le chemin du code peut directement sauter dans un bloc catch. Cela annule le mandat d'avoir une déclaration return dans la méthode qui renvoie quelque chose. Il est possible que l'instruction return ne soit pas exécutée si une exception se produit, le compilateur renvoie donc une erreur. Donc, pour éviter ce problème, vous avez besoin d'au moins 1 instruction return supplémentaire dans une méthode.
Si vous avez ajouté une instruction return dans le bloc try-finally et que vous n'avez pas de bloc catch, c'est correct. Il n'y a aucun cas de chemin de code anormal ici.
Si vous avez ajouté une instruction return dans try block et que vous avez catch block, vous pouvez alors ajouter return, dans catch block ou à la fin de la méthode.
Si vous avez ajouté une instruction return dans try block et que vous avez catch block et, enfin, block, vous pouvez alors ajouter return, dans le bloc catch ou à la fin de la méthode. Vous pouvez également choisir d’ajouter return in finally block. Si vous utilisez Eclipse, il générera un avertissement qui peut être supprimé en utilisant la définition de méthode ci-dessus -
@SuppressWarnings("finally")