0

我正在尝试将 try-catch 放入过程类型方法中,但我 95% 确定它必须是函数类型。我想要完成的是主要使我的代码更短。我想到的最重要的事情之一是将 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 参数是按值传递的。您将 0 传递给该tryCatchNum方法。将值的副本传递给该方法。此方法为其自己的副本分配一个新值,然后返回。所以原来的值还是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

下一个要阅读的故事是 Java Ranch 上的 Pass By Value 故事。 http://www.javaranch.com/campfire/StoryPassBy.jsp

您应该更改您的方法,以便它返回一个 double,该 double 分配给程序的 main 方法中的 value。

我也很好奇你为什么使用一个检查 true 的 while 循环。我认为如果输入的值无法转换为双精度值,您的程序很可能会遇到无限循环。

于 2012-10-28T22:56:34.983 回答