“main”java.util.InputMismatchException

时间:2016-11-26 13:34:50

标签: java

每当我尝试编译它时,它会不断给我一个例外: enter image description here

这是我的源代码:

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)");

1 个答案:

答案 0 :(得分:2)

您的异常不是编译时错误/异常;这是一个运行时异常。它被抛出是因为扫描仪正在读取的东西无法转换为您要求的类型(例如,扫描仪应该阅读的下一件事是"你好"但是你正在使用scanner.nextInt(), " hello"无法转换为整数,它会引发InputMismatchException。)

在您的情况下,在要求加倍时会引发异常。可能你使用了错误的语法。您应该检查系统使用哪种语法来表示双精度。例如,在某些系统上,double的小数部分和整数部分应使用,分隔,并在其他系统中使用.分隔。因此,第一类系统的一半应写为0,5,而第二类系统应写为0.5。 在Java中,扫描程序使用的语法是使用Locale实例定义的。 您可以使用locale()方法检查扫描仪使用哪一个,并使用useLocale()方法进行更改。

因此,您应该重新检查您提供的内容作为输入。

除了你的格式为double 的问题,你正在以一种令人沮丧的方式创建你的DecimalFormat (参见下面的最后一句话)并且还有另一行可能会引发异常( NumberFormatException ),如果你不注意你正在使用的Locale个实例

  

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

当您使用自己的格式来解析小数(new DecimalFormat("#.##");)时,将传递给Float.valueOf方法的字符串将取决于用于创建{的Locale实例{1}}对象DecimalFormat(在代码示例中,您没有使用特定的df实例,因此系统使用了默认的Locale实例。 Locale期望其参数使用 The Java™Language Specification 定义的特定语法,无论您的系统如何,如Java API for Float.valueOf中所述:< / p>

  

[...]其中Sign,FloatingPointLiteral,HexNumeral,HexDigits,SignedInteger和FloatTypeSuffix是在Java™语言规范的词汇结构部分中定义的,除了数字之间不接受下划线。如果s没有FloatValue的形式,则抛出NumberFormatException。

(完整的文字也太大了。请按照this link或上面的内容获取有关 Sign,FloatingPointLiteral,HexNumeral,HexDigits,SignedInteger,FloatTypeSuffix和FloatValue 的更多信息完全代表)

如果您想更改Float.valueOf对象中使用的Locale实例,请阅读the API for the DecimalFormat class

  

要获取特定区域设置的NumberFormat(包括默认区域设置),请调用NumberFormat的工厂方法之一,例如getInstance()。通常,不要直接调用DecimalFormat构造函数,因为NumberFormat工厂方法可能返回除DecimalFormat之外的子类。

在API(引用前的链接)中,他们举例说明了如何正确创建DecimalFormat的实例。

祝你好运!