المشكلة
عند استعمال ميثود nextFloat او nextDouble في السكانر وادخال رقم عشري، جافا ترمي InputMismatchException
الكود
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
float num = scanner.nextFloat();
}
}
المدخلات
1.5
الايرور الناتج
Exception in thread "main" java.util.InputMismatchException
at java.base/java.util.Scanner.throwFor(Scanner.java:947)
at java.base/java.util.Scanner.next(Scanner.java:1602)
at java.base/java.util.Scanner.nextFloat(Scanner.java:2505)
at Main.main(Main.java:6)
هذه المشكلة تصير اذا كانت لغة جهازك عربية او لغات اخرى غير الانجليزية بسبب ان الجافا تتعامل مع الارقام والفاصلة العشرية بطريقة مختلفة في كل لغة
وفي اللغة العربية الارقام الكسرية تستعمل الارقام والفاصلة العربية، وعند ادخالك لأرقام انجليزية وفاصلة انجليزية (النقطة) جافا ما تقدر تميز انه رقم كسري، بالتالي الكود يسبب اكسبشن النوع غير مطابق
الحل
عند تعريف السكانر اضف الميثود useLocale ومرر لها Locale.US مثل الكود التالي، ولا تنسى الامبورت بداية الملف:
import java.util.Locale;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in).useLocale(Locale.US);
...
}
}
هذا السطر يحدد لجافا استعمال الصياغ الانجليزي عند استعمال السكانر