web-dev-qa-db-fra.com

Comment retourne-t-il dans try, catch, enfin en Java?

Je ne comprends pas exactement comment fonctionne return dans try, catch.

  • Si j'ai try et finally sans catch, je peux mettre return à l'intérieur du bloc try.
  • Si j'ai try, catch, finally, je ne peux pas mettre return dans le bloc try.
  • Si j'ai un bloc catch, je dois mettre la return en dehors des blocs try, catch, finally.
  • Si je supprime le bloc 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);
     }
 }
27
elvis

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.

4
pramesh

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")
0
user8235810