Comment fonctionne return dans try, catch, enfin en Java?
je ne peux pas comprendre exactement comment return
try
,catch
.
- Si j'ai
try
etfinally
sanscatch
, je peux mettrereturn
à l'intérieur de latry
bloc. - Si j'ai
try
,catch
,finally
, je ne peux pas mettrereturn
dans letry
bloc. - Si j'ai un
catch
bloc, je dois mettre lereturn
à l'extérieur de l'try
,catch
,finally
blocs. - Si je supprime le
catch
etthrow Exception
, je peux mettre lereturn
à l'intérieur de latry
bloc.
Comment fonctionnent-ils exactement? Pourquoi je ne peux pas mettre le return
dans le try
bloc?
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);
}
}
7 réponses
Oui, c'est déroutant.
En Java, programme de contrôle des chemins d'un non-void
function terminer avec un return
, ou faire une exception. C'est la règle, nice et simplement.
Mais, dans une abomination, Java permet de mettre un extrareturn
dans un finally
bloc, qui remplace tout rencontrées précédemment return
:
try {
return foo; // This is evaluated...
} finally {
return bar; // ...and so is this one, and the previous `return` is discarded
}
et si j'ai essayé, attraper, finalement je ne peux pas mettre le retour dans le bloc d'essai.
vous pouvez absolument. Vous avez juste besoin de s'assurer que chaque chemin de contrôle dans votre méthode est terminée correctement. Par cela je veux dire: chaque chemin d'exécution à travers votre méthode se termine par un return
ou un throw
.
Par exemple, les ouvrages suivants:
int foo() throws Exception { … }
int bar() throws Exception {
try {
final int i = foo();
return i;
} catch (Exception e) {
System.out.println(e);
throw e;
} finally {
System.out.println("finally");
}
}
ici, vous avez deux exécutions possibles les chemins d'accès:
final int i = foo()
-
System.out.println("finally")
return i
- ou
System.out.println(e)
System.out.println("finally")
throw e
Chemin d'accès (1, 2) sont prises si aucune exception n'est levée par foo
. Le chemin (1, 3) est pris si une exception est lancée. Comment, dans les deux cas, le finally
le bloc est exécuté avant la méthode est gauche.
Enfin block va toujours s'exécuter même si nous avons attrapé l'exception dans bloc catch voire essayez le bloc exécuté comme prévu.
donc quand enfin le bloc sera exécuté avec in the flow...
si nous avons retour déclaration à l'intérieur du bloc try/catch puis avant d'exécuter la déclaration de retour enfin bloquez sera exécuté (comme pour fermer la connexion ou I/O)
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 retour déclaration à l'intérieur du enfin, l'instruction puis il s' outrepasser la déclaration de retour à l'intérieur du bloc try ou catch.
c'est le flux de programme normal quand la manipulation d'exception est impliquée. Ayant bloc catch dans le code crée un cas où le chemin de code pouvez directement sauter dans le bloc catch. Cela va à l'encontre du mandat d'avoir la déclaration de retour dans la méthode qui renvoie quelque chose. Il est possible que l'instruction return ne soit pas exécutée si exception se produit, donc le compilateur lance l'erreur. Donc, pour éviter ce problème, vous avez besoin d'au moins 1 Déclaration de retour dans une méthode.
Si vous avez ajouté un retour instruction try-finally bloc et vous n'avez pas le bloc catch, c'est ok. Il n'y a pas de chemin de code anormal ici.
si vous avez ajouté une déclaration de retour dans le bloc try et que vous avez le bloc catch, alors vous pouvez soit ajouter le retour dans le bloc catch ou à la fin de la méthode.
si vous avez ajouté une déclaration de retour dans le bloc try et que vous avez le bloc catch et finalement le bloc block, alors vous pouvez soit ajouter le retour dans le bloc catch ou à la fin de la méthode. Vous pouvez également choisir d'ajouter le retour dans le bloc finally. Si vous utilisez eclipse, il générera un avertissement qui peut être supprimé en utilisant la définition ci - dessous de la méthode -
@SuppressWarnings("finally")
je pense que c'est ce que vous vous dites:
et si j'ai essayé, attraper, finalement je ne peux pas mettre le retour dans le bloc d'essai.
Donc, si vous ajoutez un catch
bloc, vous ne pouvez pas mettre un return
dans le bloc d'essai.
Le problème est que si vous ajoutez un catch
contrôle baisse à travers et vous avez besoin d'un return
à la fin de la méthode ou c'est une erreur de syntaxe. Je n'ai pas testé mais je suppose que vous mettre un return
dans le try
bloc, mais vous devez également avoir à en ajouter un à l'intérieur de l' catch
ou puis à la fin de la méthode que vous avez maintenant.
dans le second exemple, si l'exception cochée se produit alors elle passe à l'appel d'une méthode.
dans le premier exemple, si l'exception cochée se produit alors il manipule dans la même méthode, car le bloc catch prend la responsabilité de gérer l'exception.
si vous écrivez l'instruction de retour dans le bloc de capture alors il fonctionne.
j'.e,
try{
return ..
}catch(Exception e){
return ..
}finally{
}
Mais c'est pas bien pratique.
lorsque vous utilisez des fonctions publiques autres que les fonctions nulles, vous devez retourner quelque chose ou votre fonction ne le fera pas.