web-dev-qa-db-fra.com

Java Comment renvoyez-vous une valeur à partir de try, catch et enfin?

Donc, quand je fais un code de blocs dans un "try {}", et que j'essaie de retourner une valeur, il sort "pas de valeurs de retour". C'est le code que j'utilise qui représente mon problème.

import org.w3c.dom.ranges.RangeException;


public class Pg257E5 
{
public static void main(String[]args)
{

    try
    {
        System.out.println(add(args));
    }
    catch(RangeException e)
    {
        e.printStackTrace();
    }
    finally
    {
        System.out.println("Thanks for using the program kiddo!");
    }

}
public static double add(String[] values) // shows a commpile error here that I don't have a return value
{
    try
    {
        int length = values.length;
        double arrayValues[] = new double[length];
        double sum =0;
        for(int i = 0; i<length; i++)
        {
            arrayValues[i] = Double.parseDouble(values[i]);
            sum += arrayValues[i];
        }

        return sum; // I do have a return value here. Is it because if the an exception occurs the codes in try stops and doesn't get to the return value?
    }
    catch(NumberFormatException e)
    {
        e.printStackTrace();
    }
    catch(RangeException e)
    {
        throw e;
    }
    finally
    {
        System.out.println("Thank you for using the program!");// so would I need to put a return value of type double here?
    }

}
}

Fondamentalement, la question que j'ai est la suivante: "Comment renvoyez-vous une valeur lorsque vous utilisez try and catch block?

16
user2522281

Pour renvoyer une valeur lors de l'utilisation de try/catch vous pouvez utiliser une variable temporaire, par exemple.

public static double add(String[] values) {
    double sum = 0.0;
    try {
        int length = values.length;
        double arrayValues[] = new double[length];
        for(int i = 0; i < length; i++) {
            arrayValues[i] = Double.parseDouble(values[i]);
            sum += arrayValues[i];
        }
    } catch(NumberFormatException e) {
        e.printStackTrace();
    } catch(RangeException e) {
        throw e;
    } finally {
        System.out.println("Thank you for using the program!");
    }
    return sum;
}

Sinon, vous devez avoir un retour dans chaque chemin d'exécution (bloc try ou bloc catch) qui n'a pas de throw.

24
Uwe Plonus

C'est parce que vous êtes dans une instruction try. Puisqu'il y a pourrait être une erreur, sum pourrait ne pas être initialisé, alors mettez votre déclaration de retour dans le bloc finally, de cette façon elle sera à coup sûr retournée .

Assurez-vous d'initialiser la somme en dehors de try/catch/finally pour qu'il soit dans la portée.

2
Dynomyte

Voici un autre exemple qui renvoie une valeur booléenne en utilisant try/catch.

private boolean doSomeThing(int index){
    try {
        if(index%2==0) 
            return true; 
    } catch (Exception e) {
        System.out.println(e.getMessage()); 
    }finally {
        System.out.println("Finally!!! ;) ");
    }
    return false; 
}
1
Ata ul nasar

Le problème est ce qui se passe lorsque vous obtenez NumberFormatexception levé? Vous l'imprimez et ne retournez rien.

Remarque: vous n'avez pas besoin d'attraper et de renvoyer une exception. Habituellement, cela est fait pour l'envelopper ou imprimer la trace de la pile et l'ignorer par exemple.

catch(RangeException e) {
     throw e;
}
1
Tala