2016-06-08 2 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 подсказки для ввода данных для различных вызовов функции 3 (из hasNextInt() и hasNextFloat() и hasNextDouble())?

+0

Я думаю, что эти методы 'has..' явно ждет какой-то вход, чтобы иметь для того, чтобы воздействовать на нее и решить, что тип данных, которые он является. –

+0

Это не так. '.hasNextInt' для exmaple, просто проверяет, может ли пользовательский ввод интерпретироваться как Int ** после того, как пользователь предоставил вход **. Простой поиск google - [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. Если ввод выглядит как поплавок, попробуйте его разобрать. Если это не сработало, это не было float, если он работает, то это не менее a float (может быть double или даже int, вот почему код, который вы отправили, проверяет для int, float и double в этом порядке) ,
+0

Я не понимаю, как три разных hasNext ____() вызовы не порождают три разных входа. Ref: Кроме того, если hasNextInt() или hasNextFloat() или hasNextDouble() запускает ввод данных, а не in.nextInt() или in.nextFloat() или in.nextDouble(), то как же там aren ' t 3 запрашивает ввод данных для трех различных вызовов функций (hasNextInt() и hasNextFloat() и hasNextDouble())? –

+0

Что я имею в виду, я вызываю все 3 функции _hasNextInt() _, _hasNextFloat() _ и _hasNextDouble() _. Итак, почему мне не нужно вводить данные 3 раза? –

+0

@SomenathSinha, если вы еще раз взглянете на код, вы увидите, что 'hasNextXxx()' будет только читать ввод, если это необходимо, то есть он будет считывать ввод пользователя один раз, и все вызовы этих методов будут работать на этом входе до тех пор, пока он не будет потребляется, например путем вызова 'next()'. – Thomas

1

Самый первый if(in.hasNextInt()) будет ждать, пока вы не нажмете enter. Он и все последующие 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."); 
Смежные вопросы