Comment fonctionne return dans try, catch, enfin en Java?

je ne peux pas comprendre exactement comment returntry,catch.

  • Si j'ai try et finally sans catch, je peux mettre return à l'intérieur de la try bloc.
  • Si j'ai try,catch,finally, je ne peux pas mettre return dans le try bloc.
  • Si j'ai un catch bloc, je dois mettre le return à l'extérieur de l' try,catch,finally blocs.
  • Si je supprime le catch et throw Exception, je peux mettre le return à l'intérieur de la try 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);
     }
 }
26
demandé sur Peter Mortensen 2018-06-26 10:12:02

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
}
36
répondu Bathsheba 2018-06-26 17:41:44

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:

  1. final int i = foo()
    1. System.out.println("finally")
    2. return i
  2. ou
    1. System.out.println(e)
    2. System.out.println("finally")
    3. 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.

10
répondu Konrad Rudolph 2018-06-26 10:40:56

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.

3
répondu pramesh 2018-07-01 05:56:09

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")
0
répondu mfromla 2018-06-26 12:02:14

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.

-1
répondu markspace 2018-06-26 07:18:59

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.

-2
répondu Anupama 2018-06-26 14:25:35

lorsque vous utilisez des fonctions publiques autres que les fonctions nulles, vous devez retourner quelque chose ou votre fonction ne le fera pas.

-4
répondu Wembo Mulumba 2018-06-26 17:42:53