【问题标题】:Returning a double from a method从方法返回双精度
【发布时间】:2013-01-30 21:49:48
【问题描述】:

我目前正在编写一个程序,该程序将读取指定的文本文件,该文件检查每个买入/​​卖出/摘要的交易价值并检查算法,如果买入和卖出语句中的交易不等于总交易在摘要中给出的金额,然后它会输出错误并关闭程序。但目前我的方法scanMoneyValue 有一个错误,说它没有返回双精度值,而实际上它是。我应该以不同的方式从我的方法中返回值吗?这是我的参考代码:

    import java.io.File;
    import java.io.IOException;
    import java.util.Scanner;

    import javax.swing.JFileChooser;
    import javax.swing.JOptionPane;



    public class RecurrsionFileChecker {

public static void main(String[] args) {
    int result;

    //File Chooser Window
    JFileChooser chooser = new JFileChooser("/home/nick/workspace/CS 1410-001/src/assignment03");
    chooser.setDialogTitle("Please choose a file to be checked");
    result = chooser.showOpenDialog(null);
    //User Cancelled the chooser
    if (result == JFileChooser.CANCEL_OPTION)
        return;
    File inputfile = chooser.getSelectedFile();

    try
    {   
        Scanner in = new Scanner(inputfile);
        //Call Method to look at next transaction
        scanNextTransaction(in);

    }
    catch (IOException e)
    {   
        System.out.println("Could not read file: " + inputfile);
    }



}



 /**
 * Returns double if the parameter Scanner has an error that does,
 * not match the summary before it.
 *   
 * @param s Any scanner
 * @return double if Summaries don't match.
 */
    public static double scanNextTransaction(Scanner s)
    {   
        String buy, sell, summary, date;
        double amount = 0, referenceValue, total = 0;
        summary = s.next();
        date = s.next();
        referenceValue = scanMoneyValue(s);

        while (s.hasNext())
        {   
            if (s.next() == "Buy")
            {
                date = s.next();
                amount = scanMoneyValue(s);
            }

            if(s.next() == "Sell")
            {
                date = s.next();
                amount = scanMoneyValue(s);
            }

            if(s.next() == "Summary")
            {
                amount = scanSubSummary(s);
            }
            //add the transactions
            total = total + amount;
        }
    return total;

    }



    public static double scanMoneyValue(Scanner in)
    {   
        String dollar = in.next();
        if(dollar.charAt(0) == '$')
        {   //convert string to a double
            String amount = dollar.substring(1);
            double complete = Double.parseDouble(amount);
            complete = complete * 100;
            return complete;
        }
    }


    public static double scanSubSummary(Scanner sub)
    {   
        String summaryDate, transDate, transType;
        int summarySubEntries, count = 0;
        double transValue, summaryValue = 0, totalValue = 0,  summaryAmount;

        summaryDate = sub.next();
        summaryAmount = scanMoneyValue(sub);
        summarySubEntries = sub.nextInt();

        while (count != summarySubEntries)
        {
            transType = sub.next();
            if (transType == "Summary")
            {
                summaryValue = scanSubSummary(sub);
            }
            transValue = scanMoneyValue(sub);   
            totalValue = transValue + totalValue + summaryValue;
            count++;            
        }
        if (totalValue != summaryAmount)
        {
            System.out.print("Summary error on " + summaryDate + ".");
            System.out.println("Amount is $" + summaryAmount + ", " + "should be $" + totalValue + ".");
        }
        return totalValue;

    }

}

【问题讨论】:

  • 顺便说一句,这里 90% 的代码是不必要的。如果您选择了相关的方法并将其放入一个给出相同错误的较小程序中,这将是一个更清晰的问题。
  • 以后,请将您的代码缩减到相关部分(或者最好创建一个简短但完整的程序来演示问题)。您已经发布了超过 100 行代码,但只有很小一部分代码是相关的。

标签: java double return


【解决方案1】:
public static double scanMoneyValue(Scanner in)
{   
    String dollar = in.next();
    if(dollar.charAt(0) == '$')
    {   //convert string to a double
        String amount = dollar.substring(1);
        double complete = Double.parseDouble(amount);
        complete = complete * 100;
        return complete;
    }
}

如果if 条件失败,则没有return 语句。您在条件内部有一个return,但在外部没有。您需要在末尾添加 return 语句,或者如果没有美元符号是错误则抛出异常。

【讨论】:

    【解决方案2】:

    好的,看看你的代码中唯一相关的部分:

    public static double scanMoneyValue(Scanner in)
    {   
        String dollar = in.next();
        if(dollar.charAt(0) == '$')
        {   //convert string to a double
            String amount = dollar.substring(1);
            double complete = Double.parseDouble(amount);
            complete = complete * 100;
            return complete;
        }
    }
    

    如果dollar$ 开头,您确实返回一个值...但是如果它以@ 开头,您期望会发生什么987654325@?目前,您到达方法的末尾没有返回任何内容,这是无效的。

    如果这是您无法实际处理的意外数据,您可能应该抛出异常。

    此外,由于二进制浮点类型的性质,无论如何您都不应该将double 用于货币值。考虑改用BigDecimal

    【讨论】:

    【解决方案3】:
    public static double scanMoneyValue(Scanner in)
    {   
        String dollar = in.next();
        if(dollar.charAt(0) == '$')
        {   //convert string to a double
            String amount = dollar.substring(1);
            double complete = Double.parseDouble(amount);
            complete = complete * 100;
            return complete;
        }
        //NEED RETURN STATEMENT HERE
    }
    

    您得到的错误是因为当您编写一个函数时,该函数的所有分支都必须返回一个正确类型的值。在您的情况下,如果 if 语句失败,它会到达函数的末尾而不返回任何内容。

    【讨论】:

      【解决方案4】:

      最好改一下

      public static double scanMoneyValue(Scanner in)
      {   
          String dollar = in.next();
          String amount = dollar.replaceAll("[^\\d.]+", "")
          double complete = Double.parseDouble(amount);
          complete = complete * 100;
          return complete;
      }
      

      解释链接 - Parsing a currency String in java

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多