2016-11-26 4 views
0

私はそれをコンパイルしようとするたびに、それは私に例外を与え続け: enter image description here「メイン」java.util.InputMismatchException

これは私のソースコードです:

Scanner input = new Scanner(System.in); 
DecimalFormat df = new DecimalFormat("#.##"); 

System.out.print("Gaji Pokok (x 10.000) : "); 
double gaji = input.nextDouble(); 

System.out.print("Lama Tahun Kerja : "); 
int th = input.nextInt(); 

System.out.print("Lama Bulan Kerja : "); 
float bl = input.nextFloat(); 

if (bl > 12) 
{ 
    System.out.println("Inputan bulan anda salah"); 
    System.out.print("Masukkan kembali bulan yang benar : "); 
    float blnnew = input.nextFloat(); 
    float tukar = blnnew; 
    bl = tukar; 
} 
float fak_peng; 
fak_peng = Float.valueOf(df.format((th+(bl/12))*2.5)); 

System.out.print("Jumlah Faktor Penghargaan : "); 
System.out.println(fak_peng + " %"); 

System.out.println("Nilai Sekarang : 1.0000000 "); 


float per_mppeg; 
per_mppeg = Float.valueOf(df.format(gaji*(fak_peng/100)*1)); 
System.out.print("Perhitungan MP Pegawai : "); 

System.out.println(gaji + " x " + fak_peng + "% x " + " 1.0000000 = Rp." + (per_mppeg) + "(x 10.000)"); 

System.out.print("MP Perbulan : "); 
System.out.println(per_mppeg + " + 100% = Rp." + (per_mppeg) + "(x 10.000)"); 

System.out.println("MP sekaligus 100% : "); 


float peserta; 
peserta = Float.valueOf(df.format(100.6650*per_mppeg)); 
float jd; 
jd = Float.valueOf(df.format(14.4820*per_mppeg*0.8)); 
float anak; 
anak = Float.valueOf(df.format(0.6090*per_mppeg*0.8)); 
float jml; 
jml = Float.valueOf(df.format(peserta+jd+anak)); 
System.out.println(" Peserta = 100.6650 x "+ per_mppeg + "  = " + peserta + "(x 10.000)"); 
System.out.println(" Jd/Dd = 14.4820 x "+ per_mppeg + " x 80% = " + jd + "(x 10.000)"); 
System.out.println(" Anak = 0.6090 x "+ per_mppeg + " x 80% = " + anak + "(x 10.000)"); 
System.out.println("Jumlah Total = "+ jml); 

float mpdua; 
mpdua = Float.valueOf(df.format (jml*0.2)) ; 
float mpdel; 
mpdel = Float.valueOf(df.format(per_mppeg*0.8)) ; 
System.out.println("MP Sekaligus 20% = "+ mpdua + "(x 10.000)"); 
System.out.println("MP sekaligus 80% = "+ mpdel + "(x 10.000)"); 
+0

注意を払う必要があります。サンプルコードで別の例外が発生する可能性があることがわかりました。下の私の答えをお読みください –

答えて

2

あなたの例外は、コンパイルではありません時のエラー/例外。実行時例外です。スキャナが読み取っているものが、あなたが求めているタイプに変換できないためにスローされます(例えば、スキャナが読むべき次のものは "hello"ですが、scanner.nextInt()を使用しています。 "hello"は整数に変換できませんInputMismatchExceptionが発生します)。

あなたの場合、倍精度浮動小数点型(Double)を求めるときに例外が発生します。おそらく間違った構文を使用しています。ダブルスを表すためにシステムが使用する構文をチェックする必要があります。たとえば、一部のシステムでは、doubleの小数部分と整数部分は,で、その他のシステムでは.で区切る必要があります。したがって、第1のタイプのシステムの半分は0,5と書かれ、第2のタイプは0.5と書かれるべきである。 Javaでは、スキャナが使用する構文はLocaleインスタンスで定義されています。 locale()メソッドで、スキャナで使用するものを確認し、useLocale()メソッドで変更することができます。

入力したものを再確認する必要があります。あなたはdiscommanded途中であなたのDecimalFormatを作成しているダブルのフォーマットにあなたの問題のほかに

(以下、最後の引用を参照)とそうでない場合に例外を上昇する可能性があり、別のライン(NumberFormatExceptionが)は、そこにありますあなたのよう

fak_peng = Float.valueOf(df.format((th+(bl/12))*2.5));

:あなたはを使用しているLocaleインスタンスに注意を払います(new DecimalFormat("#.##");)独自の形式を使用してFloat.valueOfメソッドに渡される文字列は、DecimalFormatオブジェクトdfの作成に使用されたLocaleインスタンスに依存します(コードサンプルでは、​​特定のLocaleインスタンスを使用しませんでした。システムのデフォルトのLocaleインスタンスが使用されます)。

[...]ログイン、FloatingPointLiteral、HexNumeral、HexDigits:しかしFloat.valueOfは、その引数は、Java™言語仕様かかわらずJava API for Float.valueOfに書かれたようにシステムによって定義された特定の構文を使用することを期待します、SignedIntegerおよびFloatTypeSuffixは、Java™言語仕様の語彙構造セクションで定義されているとおりです。ただし、数字の間にアンダースコアは使用できません。 sがFloatValueの形式を持たない場合は、NumberFormatExceptionがスローされます。

(完全なテキストはあまりにも大きすぎてここに含まれていません。

に)サインオン、FloatingPointLiteral、HexNumeral、HexDigits、SignedInteger、FloatTypeSuffixとに従ってFloatValueが正確に何を表しているかについての詳細情報を持っているthis link以上1に従ってください、あなたのDecimalFormatオブジェクトで使用Localeインスタンスを変更したい場合は、the API for the DecimalFormat classを読みます。

デフォルトロケールを含む特定のロケールのためのNumberFormatを取得するために、のgetInstance(などのNumberFormatのファクトリメソッド)のいずれかを呼び出します。 NumberFormatファクトリメソッドはDecimalFormat以外のサブクラスを返すことがあるため、DecimalFormatコンストラクタを直接呼び出さないでください。

API(NumberFormatのインスタンスを正しく作成する方法の例を引用しています)をご覧ください。

幸運を祈る!

関連する問題