วิธีอ่านค่าจำนวนเต็มจากอินพุตมาตรฐานใน Java


คำตอบ:


141

คุณสามารถใช้java.util.Scanner( API ):

import java.util.Scanner;

//...

Scanner in = new Scanner(System.in);
int num = in.nextInt();

นอกจากนี้ยังสามารถโทเค็นการป้อนข้อมูลด้วยนิพจน์ทั่วไปเป็นต้น API มีตัวอย่างและมีอื่น ๆ อีกมากมายในไซต์นี้ (เช่นฉันจะป้องกันไม่ให้สแกนเนอร์โยนข้อยกเว้นเมื่อป้อนผิดประเภทได้อย่างไร )


1
ฉันพยายามเรียกใช้ใน eclipse ID ของฉันโดยไม่มีข้อผิดพลาดทางไวยากรณ์ แต่ไม่แสดงอะไรเลยในเอาต์พุตคอนโซลเมื่อฉันพยายามส่งออกค่าจำนวนเต็มที่อ่านได้ ทำไมจึงเป็นเช่นนั้น?
rh979

@polygenelubricants: in.nextInt () ยอมรับเฉพาะค่า int ไม่ใช่ค่าจำนวนเต็ม
Ved Prakash

32

หากคุณใช้ Java 6 คุณสามารถใช้ oneliner ต่อไปนี้เพื่ออ่านจำนวนเต็มจากคอนโซล:

int n = Integer.parseInt(System.console().readLine());

17
ฉันต้องการแสดงความคิดเห็นว่าภายใต้ IDEs System.console ส่วนใหญ่จะคืนค่า null เมื่อแอปพลิเคชันถูกเรียกใช้ผ่านตัวเรียกใช้งานทำให้ยากต่อการดีบัก ดูเหมือนว่าจะเป็นจริงสำหรับ IDEA, Eclipse และ NetBeans
Andrew White

1
ถ้าเขาป้อนสตริงหรือ 'Enter' มันจะส่ง NumberFormatException ดังนั้นจึงควรควบคุมสตริงก่อนที่จะแยกวิเคราะห์เป็นจำนวนเต็ม
Vasile Surdu

จะเกิดอะไรขึ้นถ้าในบรรทัดนั้นมีจำนวนเต็มมากกว่าหนึ่งจำนวนโดยคั่นด้วยช่องว่าง
LostMohican

@LostMohican มีวิธีการอ่านโทเค็นที่คั่นด้วยช่องว่างโดยใช้ Scanner
missingfaktor

17

ที่นี่ฉันกำลังให้ 2 ตัวอย่างเพื่ออ่านค่าจำนวนเต็มจากอินพุตมาตรฐาน

ตัวอย่าง 1

import java.util.Scanner;
public class Maxof2
{ 
  public static void main(String args[])
  {
       //taking value as command line argument.
        Scanner in = new Scanner(System.in); 
       System.out.printf("Enter i Value:  ");
       int i = in.nextInt();
       System.out.printf("Enter j Value:  ");
       int j = in.nextInt();
       if(i > j)
           System.out.println(i+"i is greater than "+j);
       else
           System.out.println(j+" is greater than "+i);
   }
 }

ตัวอย่าง 2

public class ReadandWritewhateveryoutype
{ 
  public static void main(String args[]) throws java.lang.Exception
  {
System.out.printf("This Program is used to Read and Write what ever you type \nType  quit  to Exit at any Moment\n\n");
    java.io.BufferedReader r = new java.io.BufferedReader (new java.io.InputStreamReader (System.in));
     String hi;
     while (!(hi=r.readLine()).startsWith("quit"))System.out.printf("\nYou have typed: %s \n",hi);
     }
 }

ฉันชอบตัวอย่างแรกมันง่ายและเข้าใจได้ดี
คุณสามารถรวบรวมและเรียกใช้โปรแกรม JAVA ทางออนไลน์ได้ที่เว็บไซต์นี้: http://ideone.com


1
ex 2 อาจไม่ใช่วิธีที่ดีที่สุดในการแนะนำอินพุตสตรีม ... หรือฉันเดาว่า "ออบเจ็กต์อินพุตของระบบ" สำหรับคนที่เพิ่งเริ่มใช้ OOD, Java หรือการเข้ารหัสสำหรับเรื่องนั้น - รหัสอธิบายทั้งหมดนั้นและคุณตั้งชื่อวัตถุสำคัญ " r ".... คนฉลาดใช่มั้ย? xD +1
Tapper7

1
ตัวอย่างที่ 1 ไม่ได้รับการป้องกันจากอินพุตรูปแบบที่ผิดพลาด
Martin Meeser

11

ตรวจสอบสิ่งนี้:

public static void main(String[] args) {
    String input = null;
    int number = 0;
    try {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        input = bufferedReader.readLine();
        number = Integer.parseInt(input);
    } catch (NumberFormatException ex) {
       System.out.println("Not a number !");
    } catch (IOException e) {
        e.printStackTrace();
    }
}

อะไรคือจุดสำคัญในการจับNumberFormatExceptionและพิมพ์ stack trace?
missingfaktor

6

คำตอบที่สองข้างต้นเป็นคำตอบที่ง่ายที่สุด

int n = Integer.parseInt(System.console().readLine());

คำถามคือ "วิธีอ่านจากอินพุตมาตรฐาน"

คอนโซลเป็นอุปกรณ์ที่มักจะเชื่อมโยงกับแป้นพิมพ์และจอแสดงผลที่เปิดใช้งานโปรแกรม

คุณอาจต้องการทดสอบว่าไม่มีอุปกรณ์คอนโซล Java หรือไม่เช่น Java VM ไม่ได้เริ่มจากบรรทัดคำสั่งหรือสตรีมอินพุตและเอาต์พุตมาตรฐานจะถูกเปลี่ยนเส้นทาง

Console cons;
if ((cons = System.console()) == null) {
    System.err.println("Unable to obtain console");
    ...
}

การใช้คอนโซลเป็นวิธีง่ายๆในการป้อนตัวเลข รวมกับ parseInt () / Double () เป็นต้น

s = cons.readLine("Enter a int: ");
int i = Integer.parseInt(s);    

s = cons.readLine("Enter a double: ");
double d = Double.parseDouble(s);

2
-1 สำหรับการไม่ตอบคำถาม เขาไม่ต้องการอ่านจากคอนโซล แต่มาจากอินพุตมาตรฐาน
Ingo

คำถามระบุชัดเจนว่าเขาไม่ต้องการอ่านจากคอนโซล อย่างไรก็ตามขอขอบคุณที่ให้ข้อมูลเกี่ยวกับวิธีการอ่านจากคอนโซล
Srivastav

4

ตรวจสอบสิ่งนี้:

import java.io.*;
public class UserInputInteger
{
        public static void main(String args[])throws IOException
        {
        InputStreamReader read = new InputStreamReader(System.in);
        BufferedReader in = new BufferedReader(read);
        int number;
                System.out.println("Enter the number");
                number = Integer.parseInt(in.readLine());
    }
}

3

สิ่งนี้ทำให้เกิดอาการปวดหัวดังนั้นฉันจึงอัปเดตโซลูชันที่จะทำงานโดยใช้เครื่องมือฮาร์ดแวร์และซอฟต์แวร์ที่พบบ่อยที่สุดสำหรับผู้ใช้ในเดือนธันวาคม 2014 โปรดทราบว่า JDK / SDK / JRE / Netbeans และคลาสที่ตามมาคอมไพเลอร์ไลบรารีเทมเพลตตัวแก้ไขและ debuggerz คือ ฟรี.

โปรแกรมนี้ได้รับการทดสอบด้วย Java v8 u25 มันถูกเขียนและสร้างขึ้นโดยใช้
Netbeans IDE 8.0.2, JDK 1.8, OS คือ win8.1 (ขอโทษ) และเบราว์เซอร์เป็น Chrome (ขอโทษสองครั้ง) - มีไว้เพื่อช่วยจัดการ OG ของ UNIX-cmd-line กับ GUI-Web-based ที่ทันสมัย IDE ที่ ZERO COST - เนื่องจากข้อมูล (และ IDE) ควรเป็นข้อมูลฟรีเสมอ โดย Tapper7. สำหรับทุกคน.

บล็อกรหัส:

    package modchk; //Netbeans requirement.
    import java.util.Scanner;
    //import java.io.*; is not needed Netbeans automatically includes it.           
    public class Modchk {
        public static void main(String[] args){
            int input1;
            int input2;

            //Explicity define the purpose of the .exe to user:
            System.out.println("Modchk by Tapper7. Tests IOStream and basic bool modulo fxn.\n"
            + "Commented and coded for C/C++ programmers new to Java\n");

            //create an object that reads integers:
            Scanner Cin = new Scanner(System.in); 

            //the following will throw() if you don't do you what it tells you or if 
            //int entered == ArrayIndex-out-of-bounds for your system. +-~2.1e9
            System.out.println("Enter an integer wiseguy: ");
            input1 = Cin.nextInt(); //this command emulates "cin >> input1;"

            //I test like Ernie Banks played hardball: "Let's play two!"
            System.out.println("Enter another integer...anyday now: ");
            input2 = Cin.nextInt(); 

            //debug the scanner and istream:
            System.out.println("the 1st N entered by the user was " + input1);
            System.out.println("the 2nd N entered by the user was " + input2);

            //"do maths" on vars to make sure they are of use to me:
            System.out.println("modchk for " + input1);
            if(2 % input1 == 0){
                System.out.print(input1 + " is even\n"); //<---same output effect as *.println
                }else{
                System.out.println(input1 + " is odd");
            }//endif input1

            //one mo' 'gain (as in istream dbg chk above)
            System.out.println("modchk for " + input2);
            if(2 % input2 == 0){
                System.out.print(input2 + " is even\n");
                }else{
                System.out.println(input2 + " is odd");
            }//endif input2
        }//end main
    }//end Modchk
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.