الرجوع
تسجيل الدخول

مشكلة Scanner Locale

3/2/2024 4 437

المشكلة

عند استعمال ميثود 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);
        ...
    }
}

هذا السطر يحدد لجافا استعمال الصياغ الانجليزي عند استعمال السكانر