32 votes

Comment fonctionne le retour dans try, catch, enfin en Java?

Je ne peux pas comprendre exactement comment return travaux en try, catch.

  • Si j'ai try et finally sans catch, je peux mettre return à l'intérieur de l' try bloc.
  • Si j'ai try, catch, finally, je ne peux pas mettre return dans la try bloc.
  • Si j'ai un catch bloc, je dois me mettre à l' return à l'extérieur de l' try, catch, finally blocs.
  • Si je supprime l' catch bloc et throw Exception,, je peux mettre l' return à l'intérieur de l' try bloc.

Comment font-ils exactement? Pourquoi je ne peut pas mettre la return dans la 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);
     }
 }

40voto

Bathsheba Points 23209

Oui, c'est déroutant.

En Java, tous les chemins de contrôle de programme d'une fonction non void doivent se terminer par return , ou lever une exception. C'est la règle, c'est simple et agréable.

Mais, dans une abomination, Java vous permet de mettre un return supplémentaire dans un bloc finally , qui remplace tout return précédemment rencontré:

 try {
    return foo; // This is evaluated...
} finally {
    return bar; // ...and so is this one, and the previous `return` is discarded
}
 

15voto

pramesh Points 339

Enfin, le bloc s'exécute toujours, même si nous avons attiré l'exception dans le bloc catch ou même notre bloc try exécutées comme prévu.

alors quand est-bloc finally sera exécuté qu'avec le flux...

si nous devons retourner dans le bloc try/catch puis avant l'exécution de l'instruction de retour bloc finally sera exécuté (comme pour la fermeture de 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 des retour d' instruction à l'intérieur de l' instruction enfin , alors il sera de remplacer l'instruction de retour à l'intérieur du bloc try ou catch.

11voto

Konrad Rudolph Points 231505

Et si j'ai try, catch, finally je ne peux pas mettre de retour dans le bloc try.

Vous ne pouvez absolument. Vous avez juste besoin de s'assurer que chaque chemin de contrôle dans votre méthode est terminée correctement. Je veux dire par là: chaque chemin d'exécution par le biais de votre méthode soit se termine dans une return, ou dans 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 chemins d'exécution possibles:

  1. final int i = foo()
  2. soit
    1. System.out.println("finally")
    2. return i
  3. 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. Chemin (1, 3) sont prises si une exception est levée. Comment, dans les deux cas, l' finally bloc est exécuté avant la méthode est à gauche.

-1voto

markspace Points 6567

Je pense que c'est ce que vous demandez:

Et si j'ai try, catch, finally je ne peux pas mettre de retour dans le bloc try.

Donc, si vous ajoutez un catch bloc, vous ne pouvez pas mettre un return dans le bloc try.

Le problème est que si vous ajoutez un catch puis de contrôle de la tombe à 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 pourriez mettre un return dans la 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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X