【问题标题】:Try and Catch into a methodTry and Catch 成一个方法
【发布时间】:2012-10-18 07:18:36
【问题描述】:

我正在尝试将 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);


}

}

【问题讨论】:

  • Double 是一个原语,所以它是按值传递而不是按引用传递。
  • double 是一个原语; Double 是一个对象...
  • 而且对象引用也是按值传递的。使用具有相同算法的 Double 不会改变任何事情。
  • @DNA 对不起,这是一个大写错误,只是习惯于用大写字母开头。
  • 我知道原始类型能够做什么,而这就是我目前所熟悉的,Double,从我所知道的是一个类,例如:Double.parseDouble(scanner.nextLine());double decimal = 5.6它可以做什么是非常原始的。我完全不明白的是“通过引用传递”以及如何在我的代码中执行它。

标签: java function methods try-catch procedure


【解决方案1】:

Java 参数是按值传递的。您将 0 传递给 tryCatchNum 方法。将值的副本传递给该方法。此方法为其自己的副本分配一个新值,然后返回。所以原来的值还是0。

您不得将任何内容传递给该方法。相反,该方法必须返回它已验证的值。另外,请考虑使用更合适的方法名称:

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

而在main方法中:

double origAmount = readDoubleValue(); 

【讨论】:

  • 我认为这行不通,也许是一种变化,但在我的程序中 public double tryCatchNum(double value){ .... return value; } 是我所拥有的,因此主要方法 double origAmount = tryCatchNum(origAmount) 将不起作用。还有其他人在谈论的 double 和 Double 是什么?
  • 抱歉重复发布,但我将标题更改为 public double 而不是 public void 然后我删除了 break; 并使用了 return value; 并且发生了完全相同的事情 - 它评估为“ $0.0" 无论输入是什么。
  • 好的,我找到了解决方案。这很简单,但它巧妙地围绕着你的结论。我所要做的就是在main 中写:origAmount = tryCatchNum(origAmount); 这只是一个粗心的错误。
【解决方案2】:

由于 double 在 Java 中是原语,它是按值传递给方法的,因此当您更改原语的值时,对方法参数的更改不会反映在传递给方法调用的原始变量中。

阅读关于 Java 牧场的杯子故事,其中解释了按值传递和按引用传递。 http://www.javaranch.com/campfire/StoryCups.jsp

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

你应该改变你的方法,让它返回一个双精度值,它被分配给你程序的 main 方法中的值。

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

【讨论】:

  • 嗯,我认为这将是 try catch 的重点,我希望它循环直到它知道输入是有效的。然后我 break; 退出循环,我选择了这种方式,因为在我看来,为 while 循环设置一个标志太复杂了,因为我打算将它用作 try 和 catch 方法的捷径。
猜你喜欢
  • 2013-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-29
  • 2016-02-19
  • 1970-01-01
相关资源
最近更新 更多