قراءة مدخلات المستخدم باستخدام Scanner
قراءة مدخلات المستخدم باستخدام Scanner
حتى الآن كانت جميع القيم في برامجك مكتوبةً مسبقًا في الكود. البرامج الحقيقية تحتاج إلى الاستجابة للمستخدم — طلب اسم أو رقم أو خيار. توفّر Java الصنف Scanner الموجود في حزمة java.util تحديدًا لهذا الغرض؛ إذ يُغلّف أي تيار إدخال (لوحة المفاتيح، الملف، الشبكة) ويتيح لك استخراج البيانات قطعةً قطعة.
الاستيراد وإنشاء Scanner
قبل استخدام Scanner يجب استيراده، ثم إنشاء نسخة منه مرتبطة بـ System.in — تيار الإدخال القياسي الذي يمثّل لوحة المفاتيح.
scanner.close() يُحرّر المورد الداخلي. في البرامج البسيطة يكون هذا أقل أهمية، لكنه عادة جيدة تستحق البناء عليها منذ البداية.
قراءة أنواع مختلفة من البيانات
يمتلك Scanner عائلةً من توابع next…() تتناسب كل منها مع نوع أساسي في Java:
nextLine()— يقرأ السطر كاملًا حتى حرف السطر الجديد ويُعيد النص دون ذلك الحرف.next()— يقرأ الرمز التالي (سلسلة من الأحرف مفصولة بمسافات). يتوقف عند المسافة.nextInt()— يقرأ الرمز التالي ويُحوّله إلىint.nextDouble()— يقرأ الرمز التالي ويُحوّله إلىdouble.nextBoolean()— يقرأtrueأوfalse(غير حساس لحالة الأحرف).nextLong()،nextFloat()— للأعداد الأكبر أو أحادية الدقة.
عند استدعاء nextInt() يقرأ Scanner الأحرف حتى يرى مسافةً بيضاء، يُحوّل النص إلى int ويُعيده. حرف السطر الجديد الذي ضغطه المستخدم يبقى في المخزن المؤقت — وهذا هو مصدر المشكلة الأكثر شيوعًا في Scanner.
مشكلة nextLine() الشهيرة
تخيّل أنك تريد قراءة عدد صحيح ثم سطر نصي كامل:
البرنامج لا ينتظر إدخال المدينة لأن nextLine() استهلك السطر الجديد الذي تركه nextInt(). الحل هو إضافة استدعاء scanner.nextLine() مجاني مباشرةً بعد القراءة الرقمية لتفريغ ذلك السطر المتبقي:
nextInt() أو nextDouble() أو أي تابع رمزي آخر وبين nextLine() لاحق، أضف استدعاء scanner.nextLine() فارغًا بينهما لاستهلاك السطر الجديد المعلّق.
قراءة قيم متعددة باستخدام حلقة
يمكن دمج الحلقة مع Scanner لمعالجة أي عدد من المدخلات. نمط شائع هو القراءة حتى يكتب المستخدم قيمة نهائية — مدخل خاص يشير إلى انتهاء الإدخال:
التحقق من توفر المدخل
قبل استدعاء تابع القراءة يمكنك التحقق من أن الرمز التالي من النوع المتوقع فعلًا باستخدام التابع المقابل has…(). هذا يمنع الاستثناء InputMismatchException عندما يكتب المستخدم نصًا حيث يُتوقع رقم:
hasNextInt() / hasNextDouble() عند بناء برامج تفاعلية يجب أن تتعامل مع المدخلات الخاطئة بأمان. في برامج التمارين البسيطة القراءة المباشرة كافية — لكن معرفة هذا النمط ستنقذك عندما تكون المدخلات غير متوقعة.
الخلاصة
الصنف Scanner هو الجسر بين لوحة المفاتيح وبرنامجك. تذكّر النقاط الأساسية: استورد java.util.Scanner، أنشئ نسخة بـ new Scanner(System.in)، استخدم nextInt() و nextDouble() للمدخلات الرقمية و nextLine() للنصوص الكاملة، فرّغ السطر الجديد المتبقي بعد كل قراءة رمزية يعقبها nextLine()، وأغلق Scanner عند الانتهاء. بهذه الأداة يمكنك كتابة برامج تفاعلية تستجيب لمدخلات المستخدم الحقيقية — وهو الأساس لآلة الحاسبة التي ستبنيها في نهاية هذا الدرس التعليمي.