0

try-catchをプロシージャタイプのメソッドに入れようとしていますが、95%は関数型でなければならないと確信しています。私が達成しようとしているのは、メインのコードを短くすることです。私が考えた最大のことの1つは、try-catchをメソッドに入れて、メソッドを呼び出すことでした。

重要なのは、入力が整数であるかどうかを検証することです。例外をキャッチすることもできます。問題は、プログラムを続行/計算すると、検証された入力を「記憶」しないことです。これが私が問題を抱えているコードの一部です。

 public static void tryCatchNum(double value)
 {
    while(true)
    {
    try
    {
        Scanner iConsole = new Scanner(System.in);
        value = Double.parseDouble(iConsole.nextLine());
            System.out.println(" ");
        break;
    }
    catch(NumberFormatException e)
    {
        System.out.println("NumberFormatException error has oocured. Please try again.");
    }
}

}

そして、これがプログラム全体です。

    import java.util.Scanner;

    public class ch7exercise1
{
public static double compound(double oA, double cI)
{
    return roundCent((oA*(Math.pow((1+(percent(cI))),10))));
}

public static double percent(double interest)
{
    return interest/100.0;
}

public static double roundCent(double amount)
{
    return ((Math.round(amount*100))/100.0); //100.0 is mandatory.
}

public static void tryCatchNum(double value)
{
    while(true)
    {
        try
        {
            Scanner iConsole = new Scanner(System.in);
            value = Double.parseDouble(iConsole.nextLine());
            System.out.println(" ");
            break;
        }
        catch(NumberFormatException e)
        {
            System.out.println("NumberFormatException error has oocured. Please try again.");
        }
    }
}

@SuppressWarnings("unused")
public static void main(String[] args)
{
    boolean f = true;
    boolean f2 = true;
    double origAmount = 0;
    double compInterest = 0;
    double total = 0;

    Scanner iConsole = new Scanner(System.in);

    System.out.println("10 year Compound Interest Claculator\n");

    System.out.println("Input amount of money deposited in the bank");

    tryCatchNum(origAmount);

    System.out.println("Input compouded interest rate. (If the compound interest is 3% input 3)");

    tryCatchNum(compInterest);

    total = compound(origAmount,compInterest);

    System.out.println("$"+total);


}

}

4

2 に答える 2

2

Java引数は値で渡されます。tryCatchNumメソッドに0を渡します。値のコピーがメソッドに渡されます。このメソッドは、独自のコピーに新しい値を割り当ててから、を返します。したがって、元の値はまだ0です。

メソッドに何も渡してはなりません。代わりに、メソッドは検証した値を返す必要があります。また、より適切なメソッド名の使用を検討してください。

public double readDoubleValue() {
    ...
    return value;
}

そして主な方法では:

double origAmount = readDoubleValue(); 
于 2012-10-28T22:53:49.810 に答える
0

doubleはJavaのプリミティブであるため、値によってメソッドに渡されます。したがって、プリミティブの値を変更しても、メソッドパラメーターへの変更は、メソッド呼び出しに渡される元の変数に反映されません。

値渡しと参照渡しについて説明しているJava牧場のカップストーリーを読んでください。 http://www.javaranch.com/campfire/StoryCups.jsp

次に読むべき話は、JavaRanchのPassByValueの話です。 http://www.javaranch.com/campfire/StoryPassBy.jsp

プログラムのメインメソッドの値に割り当てられたdoubleを返すように、メソッドを変更する必要があります。

また、trueをチェックするwhileループを使用している理由についても非常に興味があります。入力した値をdoubleに変換できない場合、プログラムで無限ループが発生する可能性が高いと思います。

于 2012-10-28T22:56:34.983 に答える