したがって、「try {}」内でブロックのコードを実行し、値を返そうとすると、「戻り値なし」になります。これは私の問題を表す私が使用しているコードです。
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?
}
}
}
基本的に、私が抱えている質問は、「try and catchブロックを使用しているときに、どのように値を返しますか?
try/catch
を使用しているときに値を返すには、一時変数を使用できます。
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;
}
それ以外の場合は、throw
を持たないすべての実行パス(tryブロックまたはcatchブロック)にリターンが必要です。
try
ステートメントを使用しているためです。 couldエラーであるため、合計mightが初期化されないため、returnステートメントをfinally
ブロックに入れてください。そうすれば確実に返されます。
try/catch/finally
の外側でsumを初期化して、スコープ内になるようにしてください。
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;
}
問題は、NumberFormatexception
がスローされるとどうなるかです。印刷して何も返しません。
注:例外をキャッチしてスローする必要はありません。通常は、ラップするか、スタックトレースを出力して無視するなどの方法で行われます。
catch(RangeException e) {
throw e;
}