簡體   English   中英

簡單的Java輸入問題

[英]Simple java input problem

我是Java新手,在獲取輸入時遇到問題。 這是我的代碼,它似乎可以根據需要獲取第一個輸入,但是隨后跳過接下來的兩個“讀取”函數調用?

有什么建議么?

     //  open up standard input
      BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    int battMax, battMin, numNodes=0;
    System.out.print("Enter minimum battery level:");
    try {
         battMin = br.read();
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    System.out.print("Enter maximum battery level:");
     try {
        battMax = br.read();
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    System.out.print("Enter number of nodes required:");
     try {
        numNodes = br.read();
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

br.read()將讀取一個字符 此外,如果您正在從System.in讀取,則可能僅在用戶按下回車鍵時才看到某些內容-此時,如果您使用的是Windows,它將需要額外的\\r\\n讀取(或者只是\\n在Unix上為\\n )。

我懷疑您會發現第二個和第三個read()調用read()的值為\\r\\n

此外,您實際上並沒有得到想要的值-如果有人輸入“ 1”,那么您將得到49的值,因為那是該字符的Unicode值。

您應該使用readLine()讀取一行(然后使用Integer.parseInt()解析該字符串。或者,您可以使用Scanner類-我不能說我曾經用過它,但是它可能對您有用。

最后,該代碼中有很多重復-我建議您通過創建一個實用方法來重構它。 例如,您可能有:

public static int promptUserForInt(String prompt, int defaultValue,
                                   BufferedReader reader)
    throws IOException
{
    while (true)
    {
        System.out.print(prompt);
        try
        {
            String line = reader.readLine();
            return Integer.parseInt(line);
        }
        catch (NumberFormatException e)
        {
            // Adjust as appropriate...
            System.out.println
                ("Unable to parse input; please enter an integer.");
        }
    }
}

然后,您可以輕松地使用它:

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

int battMax = promptUserForInt("Enter minimum battery level:");
int battMin = promptUserForInt("Enter maximum battery level:");
int numNodes = promptUserForInt("Enter number of nodes required:");

您可以通過使用WriterBufferedWriter來進一步重構,以顯示提示-這樣您可以更輕松地對其進行測試。

最后,我建議您不要將每個位都包裝在IOException的catch塊中; 如果您無法閱讀控制台輸入,我懷疑您還是不想繼續,因此無論第一個輸入生成此異常還是第二個或第三個異常,您都希望以相同的方式進行操作。 聲明您的方法拋出IOException ,或者將所有三行都放在同一try塊中,由同一catch塊處理。

br.read()讀取一個字符。 使用Integer.parseInt(br.readLine())它將讀取整行並將其轉換為int

另外,初始化所有局部變量:

int battMax=0, battMin=0, numNodes=0;

如果您使用的是Java 1.5或更高版本,則可以使用java.util.Scanner

public static getInt(String prompt){
    int n = 0;
    try {
        System.out.print(prompt);
        Scanner kb = new Scanner(System.in);
        n = kb.nextInt();
    }
    catch(Exception ex){
       ex.printStackTrace();
    }
    return n;
}

樣品用法:

int battMax = getInt("Enter minimum battery level:");
int battMin = getInt("Enter maximum battery level:");
int numNodes = getInt("Enter number of nodes required:");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM