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?
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
.
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.
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;
}
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;
}