2012-02-10 17 views
-1

私は宿題に取り組んでいますが、私は割り当てによって何が求められているのかを少し上にしています。私は自分のコードでランタイムエラーが発生しています。私の人生にとって、私が間違っていたことを理解できません。ここでJava:ランタイムエラーが2つわかりません

は割り当てです:

は、シミュレートされた給料を表示するプログラムを書きます。プログラムは、日付、受取人の名前、および小切手の額を入力するようにユーザに尋ねる必要があります。その後、ドル金額を記入した模擬小切手が表示されます。

は、ここに私のコードです:

CheckWriter:私は言葉に番号から名前、日付、通貨、および変換の検証を処理するために外部のクラスファイルを使用しています

/* CheckWriter.java */ 

// Imported Dependencies 
import java.util.InputMismatchException; 
import java.util.Scanner; 

public class CheckWriter { 
    public static void main(String args[]) { 
     Scanner keyboard = new Scanner(System.in); 

     // Try to get the name 
     String name = ""; 
     NameValidator validateName = new NameValidator(); 
     while (validateName.validate(name) == false) { 
      System.out.println("Enter the name: "); 
      name = keyboard.nextLine(); 

      if (validateName.validate(name) == false) { 
       System.out.println("Not a valid name."); 
      } 
     } 

     // Get the date 
     String date = ""; 
     DateValidator validateDate = new DateValidator(); 
     while (!validateDate.validate(date)) { 
      System.out.println("Enter the date (dd/mm/yyyy): "); 
      date = keyboard.nextLine(); 

      if (!validateDate.validate(date)) { 
       System.out.println("Not a valid date."); 
      } 
     } 

     // Try to get the amount of the check 
     String checkAmount = ""; 
     CurrencyValidator validateCurrency = new CurrencyValidator(); 
     while (!validateCurrency.validate(checkAmount)) { 

      System.out.print("Enter the Check Amount (XX.XX): $"); 
      checkAmount = keyboard.nextLine(); 

      if (!validateCurrency.validate(checkAmount)) { 
       System.out.println("Not a valid check amount."); 
      } 
     } 

     String checkWords = checkToWords(checkAmount); // ERROR! (48) 

     System.out 
     .println("------------------------------------------------------\n" 
       + "Date: " 
       + date 
       + "\n" 
       + "Pay to the Order of: " 
       + name 
       + "   $" 
       + checkAmount 
       + "\n" 
       + checkWords 
       + "\n" 
       + "------------------------------------------------------\n"); 
    } 

    private static String checkToWords(String checkAmount) { 

     /** 
     * Here I will use the string.split() method to separate out 
     * the integer and decimal portions of the checkAmount. 
     */ 

     String delimiter = "\\.\\$"; 
     /* Remove any commas from checkAmount */ 
     checkAmount.replace(",", ""); 
     /* Split the checkAmount string into an array */ 
     String[] splitAmount = checkAmount.split(delimiter); 

     /* Convert the integer portion of checkAmount to words */ 
     NumberToWords intToWord = new NumberToWords(); 
     long intPortion = Long.parseLong(splitAmount[0]);  // ERROR! (84) 
     intToWord.convert(intPortion); 
     String intAmount = intToWord.getString() + " dollars"; 

     /* Convert the decimal portion of checkAmount to words */ 
     String decAmount = ""; 
     long decPortion = Long.parseLong(splitAmount[1]); 
     if (decPortion != 0) { 
      NumberToWords decToWord = new NumberToWords(); 
      decToWord.convert(Long.parseLong(splitAmount[1])); 
      decAmount = " and " + decToWord.getString() + " cents."; 

     } 

     return (intAmount + decAmount); 
    } 
} 

注意。これらのクラスファイルはすべて意図どおりに動作します。

私は取得していますエラーは次のとおりです。私はラインをコメントしている ""

at java.lang.NumberFormatException.forInputString(Unknown Source) 

at java.lang.Long.parseLong(Unknown Source) 

at java.lang.Long.parseLong(Unknown Source) 

at CheckWriter.checkToWords(CheckWriter.java:82) 

at CheckWriter.main(CheckWriter.java:46) 

:入力文字列の場合:スレッド "メイン" java.lang.NumberFormatExceptionで

例外私が経験しているエラーを引き起こしている私のコード。

誰かが私のコードが間違っている場所を見つけ出すのを助けてくれますか?他のクラスファイルが必要と思われる場合は、それを含めることができます。

EDIT:コードを実行すると、名前と日付が尋ねられます。小切手の額を尋ねる前に、それはエラーを投げる時です。

編集2:巨大なcotton.mに感謝!彼のアドバイスのおかげで、私はこのように見えるようにしながら文を変更しました:

while(!validateDate.validate(date) && date == "") 

これが今の私の問題を修正しました。正規表現でデータを検証すると、空の文字列がtrueを返すように見えます。

+0

デバッガを使用して、splitAmount [0]の値がエラーの行にあることをお知らせください。 – nolt2232

+0

空の文字列でLong.parseLongを呼び出しています。あなたはそれをすることはできません。最初に空の文字列をテストします。 –

+2

ここに貼り付けた例外は、エラーがどの行にあるかを明確に示しています。 "parseLong"メソッドに入力されている値を表示して(デバッガの使い方がわからない場合は)何を表示するのはなぜですか? – eternaln00b

答えて

2

空の長さの文字列で解析しようとしている文字列。

1)checkToWordsの開始時にcheckAmountの値をチェックする

私の提案は次のようになります - それは空白である場合に、分割をしないでください、あなたの問題

2)があります。あなたがしたように$を置き換えてください(これはあなたの本当の問題だと思います)。

また、10000.00は長くないという別の問題があります。あなたはあなたを分けているのが分かります。それは本当にあなたが望むものですか?

+0

問題は、チェック金額を求めるセクションにプログラムが届かないことです。 splitAmountの各添え字はNumberToWordsクラスに別々に送られるので、そこに問題はないはずです。 –

+1

@ shattered.likeness ah-HA!小切手の額を伺っているところを過去にしています。だから、尋ねることなくその部分をどのように過ぎ去っていますか? validateCurrency.validateは、空の文字列に対してtrueを返す必要があります。したがって、そのループを変更するか、そのループを変更して、**と**が空の長さの文字列ではないことを検証するものを確認してください。 –

+0

私はあなたに投票するために十分な評判を持っていたと思います!私は自分の変数の値を「不可能な真の値」に変更しました。今ではプログラムは完璧に動作しています! –

2

NumberFormatExceptionです。checkAmount(メソッドパラメータ)の値が有効なNumberではありません。

あなたは、そうでない場合checkAmountはまだ内部に、持っているとNumberFormatExcpetionの原因となりますcheckAmount=checkAmount.replace(",", "");

を設定する必要があります。

+0

これをキャッチしませんでした。ありがとう! まだ同じ問題があります。小切手の金額を尋ねるプロンプトが表示されることはありません。 –

0

それは次のようになります。

String delimiter = "[\\.\\$]"; 

、その後、あなたはsplitWord [i]が空ではないことを確認する必要があります。

+0

"$"の区切り文字を削除しました。これは既にプロンプ​​トに表示されています。だから今は "\\"だけを使うべきです。デリミタとして使用します。 –

2

あなたの問題は区切り文字の正規表現で現在\.\$を使用しています。これはリテラル.に続いてリテラル$に分割されます。私はあなたが実際に行うことを意図していること.または$のいずれかに分割し、その次のいずれかにあなたの区切り文字を変更することであると仮定しています:

String delimiter = "\\.|\\$" 

または

String delimiter = "[\\.\\$]" 

あなたのコードが今では、checkAmount.split(delimiter)は文字列をどこにでもうまく分割できないので、Long.parseLong(splitAmount[0])Long.parseLong(checkAmount)に相当します。

関連する問題