2016-06-08 33 views
1

這是檢查什麼樣的輸入通過System.in輸入流是可用的,並決定哪些數據類型的變量將其存儲在一個程序的程序代碼是:該程序如何在不知道數據類型的情況下接受數據?

import java.util.Scanner; 
public class hasNextNumberDemo 
{ 
    public static void main(String args[]) 
    { 
     Scanner in = new Scanner(System.in); 
     System.out.print("Enter your Data :"); 
     if(in.hasNextInt()) 
      System.out.println("You have entered an Integer as : " + in.nextInt()); 
     else if(in.hasNextFloat()) 
      System.out.println("You have entered an Float Value as : " + in.nextFloat()); 
     else if(in.hasNextDouble()) 
      System.out.println("You have entered an Double Value as : " + in.nextDouble()); 
     else 
      System.out.println("Token not an Integer or a real value."); 
    } 
} 

在這裏,我們清楚地看到,該數據可以通過多個點被接受:in.nextInt()in.nextFloat()甚至in.nextDouble(),但都通過一個語句之前檢查輸入的數據類型(這是有待輸入[經由hasNextInt()hasNextFloat()hasNextDouble()])。

我的問題是程序如何決定在接受數據之前下一個標記是什麼數據類型?

此外,如果hasNextInt()hasNextFloat()hasNextDouble()觸發數據的輸入,而不是in.nextInt()in.nextFloat()in.nextDouble(),那麼如何來有不是3個提示輸入的hasNextInt()hasNextFloat()爲3所不同的函數調用的數據(和hasNextDouble())?

+0

我認爲這些'has..'方法顯然等待一些輸入有,以採取行動,並決定什麼是數據類型它是。 –

+0

它不是。例如「.hasNextInt」,只需在用戶提供輸入**後檢查用戶輸入是否可以解釋爲Int **。簡單的谷歌搜索 - [hasNextInt](https://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#hasNextInt()) – yonisha

回答

4

掃描器將嘗試解析下一個輸入,如果成功則數據類型適合。

舉個例子看看的hasNextFloat()實現:

public boolean hasNextFloat() { 
    setRadix(10); 
    boolean result = hasNext(floatPattern()); 
    if (result) { // Cache it 
     try { 
      String s = processFloatToken(hasNextResult); 
      typeCache = Float.valueOf(Float.parseFloat(s)); 
     } catch (NumberFormatException nfe) { 
      result = false; 
     } 
    } 
    return result; 
} 

正如你可以看到有涉及幾個步驟:輸入

  1. 檢查是否爲浮動,即模式匹配是否看起來像一個浮動?
  2. 如果輸入看起來像一個浮動,嘗試解析它。如果失敗,它不是一個浮動,如果它的工作,它是至少浮動(可能是double或甚至int,這就是爲什麼你發佈的代碼檢查int,float和double的順序) 。
+0

我不明白的是三種不同的方式hasNext ____()調用不生成三個不同的輸入。如果hasNextInt()或hasNextFloat()或hasNextDouble()觸發數據的輸入,而不是in.nextInt()或in.nextFloat()或in.nextDouble(),那麼怎麼會有這樣的結果呢? t 3提示輸入3個不同函數調用(hasNextInt()和hasNextFloat()和hasNextDouble())的數據? –

+0

我的意思是,我調用_hasNextInt()_,_hasNextFloat()_和_hasNextDouble()_函數的全部3個。那麼爲什麼我不提示3次輸入數據呢? –

+0

@SomenathSinha如果您進一步瞭解代碼,您會看到'hasNextXxx()'只會在需要時讀取輸入,即它將讀取一次用戶輸入,並且對這些方法的所有調用都將在該輸入上運行,直到它消耗,例如通過調用next()。 – Thomas

1

第一個if(in.hasNextInt())將等到您按下回車鍵。它和所有後續的has-方法將與該輸入行一起工作,直到next-方法消耗它爲止。

hasNext()無法在沒有掃描儀的情況下決定是否有輸入行或「流尾」。控制檯輸入沒有結束,所以hasNext()最終將是true。但是,除非在緩衝區中有一行文字作爲證據,否則掃描儀無法確定。

可以改寫你的代碼爲

Scanner in = new Scanner(System.in); 
    System.out.print("Enter your Data :"); 
    String next = in.next(); 
    if (isInt(next)) 
     System.out.println("You have entered an Integer as : " + parseInt(next); 
    else if(isFloat(next)) 
     System.out.println("You have entered an Float Value as : " + parseFloat(next)); 
    else if(isDouble(next)) 
     System.out.println("You have entered an Double Value as : " + parseDouble(next)); 
    else 
     System.out.println("Token not an Integer or a real value."); 
相關問題