1

私は現在、指定されたテキスト ファイルを読み込んで、各購入/販売/要約のトランザクション値をチェックし、購入ステートメントと販売ステートメントからのトランザクションが合計トランザクション額と等しくない場合に算術をチェックするプログラムを作成しています。要約で指定された場合、エラーを出力してプログラムを閉じます。しかし、現在、私のメソッドscanMoneyValueには、実際には double が返されているのに、double が返されていないというエラーがあります。メソッドから値を返す別の方法はありますか? 参照用の私のコードは次のとおりです。

    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;

    }

}

4

4 に答える 4

5
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か、ドル記号がないことがエラーの場合は例外をスローする必要があります。

于 2013-01-30T21:52:42.443 に答える
5

さて、あなたのコードの唯一の関連部分を見てください:

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$$

これが実際には処理できない予期しないデータである場合は、おそらく例外をスローする必要があります。

doubleさらに、バイナリ浮動小数点型の性質上、実際には通貨値に使用しないでください。BigDecimal代わりに使用することを検討してください。

于 2013-01-30T21:53:05.753 に答える
0

オンに変更した方が良い

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;
}

説明のリンク - Javaで通貨文字列を解析する

于 2013-01-30T21:59:00.337 に答える
0
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 ステートメントが失敗すると、何も返さずに関数の最後に到達します。

于 2013-01-30T21:53:59.347 に答える