สิ่งที่จะกล่าวถึงในที่นี้คือเกี่ยวกับวิธีการถัดไปและวิธีการ nextLine ในคลาสสแกนเนอร์ Java next() และ nextLine() คืออะไร?
ปัญหาเกิดขึ้น:
มาดูโค้ดต่อไปนี้ก่อน: อินพุตและเอาต์พุตคอนโซลอย่างง่าย:
ดู plaincopy ไปที่ clipboardprint หรือไม่
แพ็คเกจ cn.nileader.app.vi;
นำเข้า java.util.Scanner;
การทดสอบชั้นเรียนสาธารณะ {
โมฆะคงที่สาธารณะ main (String [] args) พ่นข้อยกเว้น {
เครื่องสแกนเนอร์ cin = เครื่องสแกนเนอร์ใหม่ (System.in);
สตริงพรรณี = cin.nextLine();
System.out.print("ใช้เมธอด next() ของคลาส Scanner เพื่อรับสตริงที่คุณเพิ่งป้อน: "+ni+" และความยาวคือ "+ni.length());
พรรณี = cin.nextLine();
System.out.print("ใช้เมธอด next() ของคลาส Scanner เพื่อรับสตริงที่คุณเพิ่งป้อน: "+ni+" และความยาวคือ "+ni.length());
-
-
แพ็คเกจ cn.nileader.app.vi;
นำเข้า java.util.Scanner;
การทดสอบชั้นเรียนสาธารณะ {
โมฆะคงที่สาธารณะ main (String [] args) พ่นข้อยกเว้น {
เครื่องสแกนเนอร์ cin = เครื่องสแกนเนอร์ใหม่ (System.in);
สตริงพรรณี = cin.nextLine();
System.out.print("ใช้เมธอด next() ของคลาส Scanner เพื่อรับสตริงที่คุณเพิ่งป้อน: "+ni+" และความยาวคือ "+ni.length());
พรรณี = cin.nextLine();
System.out.print("ใช้เมธอด next() ของคลาส Scanner เพื่อรับสตริงที่คุณเพิ่งป้อน: "+ni+" และความยาวคือ "+ni.length());
-
-
ดูรหัสต่อไปนี้อีกครั้ง:
ดู plaincopy ไปที่ clipboardprint หรือไม่
แพ็คเกจ cn.nileader.app.vi;
นำเข้า java.util.Scanner;
การทดสอบชั้นเรียนสาธารณะ {
โมฆะคงที่สาธารณะ main (String [] args) พ่นข้อยกเว้น {
เครื่องสแกนเนอร์ cin = เครื่องสแกนเนอร์ใหม่ (System.in);
สตริงพรรณี = cin.next();
System.out.print("ใช้เมธอด next() ของคลาส Scanner เพื่อรับสตริงที่คุณเพิ่งป้อน: "+ni+" และความยาวคือ "+ni.length());
พรรณี = cin.next();
System.out.print("ใช้เมธอด next() ของคลาส Scanner เพื่อรับสตริงที่คุณเพิ่งป้อน: "+ni+" และความยาวคือ "+ni.length());
-
-
แพ็คเกจ cn.nileader.app.vi;
นำเข้า java.util.Scanner;
การทดสอบชั้นเรียนสาธารณะ {
โมฆะคงที่สาธารณะ main (String [] args) พ่นข้อยกเว้น {
เครื่องสแกนเนอร์ cin = เครื่องสแกนเนอร์ใหม่ (System.in);
สตริงพรรณี = cin.next();
System.out.print("ใช้เมธอด next() ของคลาส Scanner เพื่อรับสตริงที่คุณเพิ่งป้อน: "+ni+" และความยาวคือ "+ni.length());
พรรณี = cin.next();
System.out.print("ใช้เมธอด next() ของคลาส Scanner เพื่อรับสตริงที่คุณเพิ่งป้อน: "+ni+" และความยาวคือ "+ni.length());
-
-
ข้อมูลโค้ดข้างต้นถูกต้องและน่าเบื่อทั้งหมด
สิ่งมหัศจรรย์กำลังมา...
เรียกใช้รหัสต่อไปนี้:
ดู plaincopy ไปที่ clipboardprint หรือไม่
แพ็คเกจ cn.nileader.app.vi;
นำเข้า java.util.Scanner;
การทดสอบชั้นเรียนสาธารณะ {
โมฆะคงที่สาธารณะ main (String [] args) พ่นข้อยกเว้น {
เครื่องสแกนเนอร์ cin = เครื่องสแกนเนอร์ใหม่ (System.in);
สตริงพรรณี = cin.next();
System.out.println("การใช้เมธอด next() ของคลาส Scanner เพื่อรับสตริงที่คุณเพิ่งป้อนคือ: "+ni+" และความยาวคือ "+ni.length());
พรรณี = cin.nextLine();
System.out.print("ใช้เมธอด next() ของคลาส Scanner เพื่อรับสตริงที่คุณเพิ่งป้อน: "+ni+" และความยาวคือ "+ni.length());
-
-
แพ็คเกจ cn.nileader.app.vi;
นำเข้า java.util.Scanner;
การทดสอบชั้นเรียนสาธารณะ {
โมฆะคงที่สาธารณะ main (String [] args) พ่นข้อยกเว้น {
เครื่องสแกนเนอร์ cin = เครื่องสแกนเนอร์ใหม่ (System.in);
สตริงพรรณี = cin.next();
System.out.println("การใช้เมธอด next() ของคลาส Scanner เพื่อรับสตริงที่คุณเพิ่งป้อนคือ: "+ni+" และความยาวคือ "+ni.length());
พรรณี = cin.nextLine();
System.out.print("ใช้เมธอด next() ของคลาส Scanner เพื่อรับสตริงที่คุณเพิ่งป้อน: "+ni+" และความยาวคือ "+ni.length());
-
-
ผลการวิ่งมีดังนี้:
เจ้าของร้าน
ใช้เมธอด next() ของคลาส Scanner เพื่อรับสตริงที่คุณเพิ่งป้อน: ni shopkeeper ความยาวคือ 4
ใช้เมธอด next() ของคลาส Scanner เพื่อรับสตริงที่คุณเพิ่งป้อน: ความยาวคือ 0
มันจบลงแล้ว เมื่อใช้วิธีการ next และ nextLine ของ Java Scanner ร่วมกัน
คุณไม่มีโอกาสเข้าสู่สายที่สอง! - -
การวิเคราะห์ปัญหา:
ความแตกต่างที่ชัดเจนระหว่างวิธีถัดไปและวิธี nextLine คือวิธีแรกอ่าน "ส่วน" ของอักขระ ในขณะที่วิธีหลังอ่านบรรทัดของสตริง
พูดง่ายๆ ก็คือ สาเหตุของปรากฏการณ์ข้างต้นส่วนใหญ่เกิดจากการขาดความรับผิดชอบของเมธอด next()
วิธีถัดไป () ทำงานอย่างไร: (พูดอย่างผิวเผิน)
สแกนจากบรรทัดจนกว่าคุณจะพบตัวระบุเฉพาะ: ช่องว่างหรืออักขระขึ้นบรรทัดใหม่ (n) และรับอักขระ (สตริง) ก่อนหน้านั้น
ดูที่นี่ เมธอด next() แรกอ่านว่า "ni shopkeeper" แต่ไม่ได้อ่าน "n" และไม่รับผิดชอบต่อการขึ้นบรรทัดใหม่ จากนั้นจึงส่ง "n" ไปที่ nextLine() เพื่อประมวลผล
ดังที่คุณทราบ nextLine() อยู่ในประเภท "เห็นเงิน" ซึ่งยอมรับ "n" เมื่อเห็น จากนั้นจะสแกนเนื้อหาก่อน n ซึ่งเป็นสตริงว่าง แล้วมีบางอย่างผิดพลาด
การแก้ปัญหา:
ดู plaincopy ไปที่ clipboardprint หรือไม่
แพ็คเกจ cn.nileader.app.vi;
นำเข้า java.util.Scanner;
การทดสอบชั้นเรียนสาธารณะ {
โมฆะคงที่สาธารณะ main (String [] args) พ่นข้อยกเว้น {
เครื่องสแกนเนอร์ cin = เครื่องสแกนเนอร์ใหม่ (System.in);
สตริงพรรณี = cin.next();
System.out.println("การใช้เมธอด next() ของคลาส Scanner เพื่อรับสตริงที่คุณเพิ่งป้อนคือ: "+ni+" และความยาวคือ "+ni.length());
ในขณะที่( (พรรณี = cin.nextLine()).เท่ากับ("") ){}
System.out.print("ใช้เมธอด next() ของคลาส Scanner เพื่อรับสตริงที่คุณเพิ่งป้อน: "+ni+" และความยาวคือ "+ni.length());
-
-
แพ็คเกจ cn.nileader.app.vi;
นำเข้า java.util.Scanner;
การทดสอบชั้นเรียนสาธารณะ {
โมฆะคงที่สาธารณะ main (String [] args) พ่นข้อยกเว้น {
เครื่องสแกนเนอร์ cin = เครื่องสแกนเนอร์ใหม่ (System.in);
สตริงพรรณี = cin.next();
System.out.println("การใช้เมธอด next() ของคลาส Scanner เพื่อรับสตริงที่คุณเพิ่งป้อนคือ: "+ni+" และความยาวคือ "+ni.length());
ในขณะที่( (พรรณี = cin.nextLine()).เท่ากับ("") ){}
System.out.print("ใช้เมธอด next() ของคลาส Scanner เพื่อรับสตริงที่คุณเพิ่งป้อน: "+ni+" และความยาวคือ "+ni.length());
-
-
ผลการวิ่ง:
เจ้าของร้าน
ใช้เมธอด next() ของคลาส Scanner เพื่อรับสตริงที่คุณเพิ่งป้อน: ni shopkeeper ความยาวคือ 4
เป็นอัจฉริยะ
ใช้เมธอด next() ของคลาส Scanner เพื่อรับสตริงที่คุณเพิ่งป้อน: เขาเป็นอัจฉริยะและมีความยาว 4
ใส่ cin.nextLine() อันที่สองดั้งเดิม
เปลี่ยนเป็น while( (ni = cin.nextLine()).equals("") ){}
ด้วยวิธีนี้ อิทธิพลของ "n" ในบรรทัดก่อนหน้าจึงสามารถขจัดออกไปได้