كيف يمكنني الحفاظ على الماسح الضوئي من رمي الاستثناءات عند إدخال النوع الخطأ؟
-
21-09-2019 - |
سؤال
إليك بعض رمز النماذج:
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
استمر في المطالبة حتى يتم استيفاء حالة معينة.