&引用;“主要”;java.util.InputMismatchException

&引用;“主要”;java.util.InputMismatchException,java,Java,每当我试图编译它时,它总是给我一个异常: 这是我的源代码: 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 = i

每当我试图编译它时,它总是给我一个异常:

这是我的源代码:

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

您的异常不是编译时错误/异常;这是一个运行时异常。抛出它是因为扫描仪正在读取的内容无法转换为您要求的类型(例如,扫描仪应该读取的下一个内容是“hello”,但您正在使用
scanner.nextInt()
,因为“hello”无法转换为整数,它将引发InputMismatchException)

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

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

除了double格式的问题外,您正在以一种不协调的方式创建DecimalFormat(请参见下面最后一段引语),如果您不注意所使用的
区域设置
实例,还有一行可能会引发异常(NumberFormatException):

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

当您使用自己的格式解析十进制(
new DecimalFormat(“#.#########
”)时,将传递给
Float.valueOf
方法的字符串将取决于用于创建
DecimalFormat
对象
df
(在代码示例中,您没有使用特定的
Locale
实例,因此使用了系统默认的
Locale
实例)。但是
Float.valueOf
希望其参数使用Java定义的特定语法™ 语言规格与您的系统无关
,如中所述:

[…]其中,Sign、FloatingPointLiteral、hexnumeric、HexDigits、SignedInteger和FloatTypeSuffix是在Java的词汇结构部分中定义的™ 语言规范,但数字之间不接受下划线。如果s的形式不是FloatValue,则引发NumberFormatException

(完整文本太大,此处包含的内容太多。请遵循或遵循上面的内容,以获得有关符号、FloatingPointLiteral、hexnumeric、HexDigits、SignedInteger、FloatTypeSuffix和FloatValue确切表示的内容的更多信息)

如果要更改
DecimalFormat
对象中使用的
区域设置
实例,请阅读

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

在API中(紧跟在引号之前的链接),它们给出了一个示例,说明如何正确创建
NumberFormat
的实例


祝您好运!

您的异常不是编译时错误/异常;而是运行时异常。引发该异常是因为扫描仪正在读取的内容无法转换为您要求的类型(例如,扫描仪应该读取的下一个内容是“hello”,但您正在使用
scanner.nextInt()
,即“hello”)无法转换为整数(它将引发InputMismatchException)

在您的情况下,请求双精度时会引发异常。可能您使用了错误的语法。您应该检查系统用于表示双精度的语法。例如,在某些系统上,双精度的小数部分和整数部分应该用
分隔,而在其他系统上则用
分隔。因此,一个ha第一种系统上的lf应写为
0,5
,而第二种系统上的lf应写为
0.5
。 在Java中,扫描程序使用的语法是通过实例定义的。 您可以检查扫描仪使用的方法,并使用该方法进行更改

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

除了double格式的问题外,您正在以一种不协调的方式创建DecimalFormat(请参见下面最后一段引语),如果您不注意所使用的
区域设置
实例,还有一行可能会引发异常(NumberFormatException):

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

当您使用自己的格式解析十进制(
new DecimalFormat(“#.#########
”)时,将传递给
Float.valueOf
方法的字符串将取决于用于创建
DecimalFormat
对象
df
(在代码示例中,您没有使用特定的
Locale
实例,因此使用了系统默认的
Locale
实例)。但是
Float.valueOf
希望其参数使用Java定义的特定语法™ 语言规格与您的系统无关
,如中所述:

[…]其中,Sign、FloatingPointLiteral、hexnumeric、HexDigits、SignedInteger和FloatTypeSuffix是在Java的词汇结构部分中定义的™ 语言规范,但数字之间不接受下划线。如果s的形式不是FloatValue,则引发NumberFormatException

(完整文本太大,此处包含的内容太多。请遵循或遵循上面的内容,以了解有关符号、浮点文字、十六进制数字、十六进制数字、SignedInteger、浮点类型后缀和浮点值的详细信息。)