كيف يمكنني الحفاظ على الماسح الضوئي من رمي الاستثناءات عند إدخال النوع الخطأ؟

StackOverflow https://stackoverflow.com/questions/2496239

سؤال

إليك بعض رمز النماذج:

import java.util.Scanner;
class In
{
    public static void main (String[]arg) 
    {
    Scanner in = new Scanner (System.in) ;
    System.out.println ("how many are invading?") ;
    int a = in.nextInt() ; 
    System.out.println (a) ; 
    } 
}

إذا قمت بتشغيل البرنامج وأعطيته int مثل 4, ، ثم كل شيء يسير على ما يرام.

من ناحية أخرى ، إذا أجبت too many لا يضحك على مزاحتي المضحكة. بدلاً من ذلك أحصل على هذا (كما هو متوقع):

Exception in thread "main" java.util.InputMismatchException
    at java.util.Scanner.throwFor(Scanner.java:819)
    at java.util.Scanner.next(Scanner.java:1431)
    at java.util.Scanner.nextInt(Scanner.java:2040)
    at java.util.Scanner.nextInt(Scanner.java:2000)
    at In.main(In.java:9)

هل هناك طريقة لجعلها تتجاهل الإدخالات التي لا تتجاهل أو تُطالب بـ "كم عدد الغزو؟" أود أن أعرف كيف أفعل كل منهما.

هل كانت مفيدة؟

المحلول

يمكنك استخدام واحدة من العديد hasNext* طرق ذلك Scanner لديه للتحقق المسبق.

    if (in.hasNextInt()) {
        int a = in.nextInt() ; 
        System.out.println(a);
    } else {
        System.out.println("Sorry, couldn't understand you!");
    }

هذا يمنع InputMismatchException من أن يتم إلقاؤه ، لأنك تتأكد دائمًا من ذلك إرادة تطابق قبل قراءته.


java.util.Scanner API

  • boolean hasNextInt(): عائدات true إذا كان يمكن تفسير الرمز المميز التالي في إدخال هذا الماسح الضوئي على أنه قيمة int في الدعامة الافتراضية باستخدام nextInt() طريقة. الماسح الضوئي لا يتقدم بعد أي مدخلات.

  • String nextLine(): يطور هذا الماسح الضوئي عبر الخط الحالي ويعيد المدخلات التي تم تخطيها.

ضع في اعتبارك الأقسام بالخط العريض. hasNextInt() لا يتقدم بعد أي مدخلات. إذا عاد true, ، يمكنك تقدم الماسح الضوئي عن طريق الاتصال nextInt(), ، والتي لن ترمي InputMismatchException.

إذا عاد false, ، ثم تحتاج إلى تخطي "القمامة". أسهل طريقة للقيام بذلك هي فقط عن طريق الاتصال nextLine(), ، ربما مرتين ولكن مرة واحدة على الأقل.

لماذا قد تحتاج إلى القيام به nextLine() مرتين ما يلي: لنفترض أن هذا هو المدخلات التي تم إدخالها:

42[enter]
too many![enter]
0[enter]

دعنا نقول أن الماسح الضوئي في بداية هذا المدخلات.

  • hasNextInt() صحيح، nextInt() عائدات 42; ؛ الماسح الضوئي الآن في فقط قبل الأول [enter].
  • hasNextInt() هو زائف، nextLine() إرجاع سلسلة فارغة ، ثانية nextLine() عائدات "too many!"; ؛ الماسح الضوئي الآن في بعد ذلك مباشرة الثاني [enter].
  • hasNextInt() صحيح، nextInt() عائدات 0; ؛ الماسح الضوئي الآن في فقط قبل الثالث [enter].

إليك مثال على تجميع بعض هذه الأشياء معًا. يمكنك تجربة ذلك لدراسة كيف Scanner يعمل.

        Scanner in = new Scanner (System.in) ;
        System.out.println("Age?");
        while (!in.hasNextInt()) {
            in.next(); // What happens if you use nextLine() instead?
        }
        int age = in.nextInt();
        in.nextLine(); // What happens if you remove this statement?

        System.out.println("Name?");
        String name = in.nextLine();

        System.out.format("[%s] is %d years old", name, age);

دعنا نقول أن المدخلات هي:

He is probably close to 100 now...[enter]
Elvis, of course[enter]

ثم السطر الأخير من الإخراج هو:

[Elvis, of course] is 100 years old

نصائح أخرى

بشكل عام ، أنا حقًا لا أحب استخدام نفس دعوة المكتبة لكل من القراءة والتحليل. يبدو أن مكتبات اللغات غير مرنة للغاية وغالبًا ما لا يمكن ثنيها على إرادتك.

الخطوة الأولى التي تسحب البيانات من System.in يجب ألا تكون قادرة على الفشل ، لذلك اجعلها قراءتها كسلسلة في متغير ، ثم قم بتحويل متغير السلسلة إلى int. إذا فشل التحويل ، فهو رائع-طباعة خطأك واستمر.

عندما تغلب التيار الخاص بك بشيء يمكن أن يرمي استثناء ، فإنه يصبح نوعًا من الإرباك فقط ما الحالة التي تترك فيها الفوضى بأكملها دفقك.

إنها دائمًا فائدة لديك يلقي التطبيق الخاص بك خطأ عند حدوث خطأ يعارض طرقًا احتفظ من الحدوث.

بديل واحد هو لف الرمز داخل أ try {...} catch {...} كتلة ل InputMismatchException. قد ترغب أيضًا في لف الرمز داخل أ while حلقة للحصول على Scanner استمر في المطالبة حتى يتم استيفاء حالة معينة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top