检查输入是否是Java中的Primitive类型?

时间:2016-01-03 09:27:26

标签: java primitive-types

我必须检查每个输入,如果它是原语或引用的类型的实例,则打印出来。但我每次都得到相同的输出。

注意:我搜索SO,但没有运气。 How can I check if an input is a integer or String, etc.. in JAVA?

代码:

public class Demo {

public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    for(int i=0; i<9; ++i){
        String input = br.readLine();
         showPremitive(input);//check for every input
    }     
}
public static void showPremitive(Object input){
    try{
            if (input instanceof Short)
                System.out.println("Primitive : short");
            else if(input instanceof Integer)
                System.out.println("Primitive : int");
            else if(input instanceof Long)
                System.out.println("Primitive : long");
            else if(input instanceof Float)
                System.out.println("Primitive : float");
            else if(input instanceof Double)
                System.out.println("Primitive : double");        
            else if(input instanceof Boolean)
                System.out.println("Primitive : bool");
            else if(input instanceof Character)
                System.out.println("Primitive : char");
            else if(input instanceof Byte)
                System.out.println("Primitive : byte");
            else  
                System.out.println("Reference : string");
         }  
    catch (InputMismatchException e){
        System.out.println("Exception occur = "+e);
    }
}

}

输出:

Reference : string
Reference : string
Reference : string
Reference : string
Reference : string
Reference : string
Reference : string
Reference : string
Reference : string

2 个答案:

答案 0 :(得分:2)

您将输入分配给String变量。它将成为一个字符串。

String input = br.readLine();
//^^^ it's a string
//                  ^^^ readLine() returns String

使用您拥有的方法可能无法实现您想要实现的目标。

您正在使用java.io.BufferedReader.readLine()进行输入。

请参阅documentation for BufferedReader

public String readLine()
                throws IOException

无论输入实际包含什么,它都会返回String

例如,"0"是一个字符串,即使它包含一个数字,可以转换为int

一种可能的方法(如果有内置或现有方法,我不知道)将反复尝试将输入转换为您要检查的每种数据类型。如果没有匹配则打印“string”。例如:

String input = br.readLine();
try{
    int i = Integer.parseInt(input);
    System.out.println("It's an int!");
}catch(Exception e){
    //well, guess not
    //do the same for all the other types
}

在这里,我从int开始。但是,请确保从最独特的类型开始。例如,int可以投放到double。因此,首先检查int ,或者当它适合double时,您可以说它是int(例如输入为5,在检查它是double)之前检查它是否为整数。

答案 1 :(得分:2)

在我提出您的问题之前,您似乎对Java和Scanner存在一些误解。

  1. 您从输入流中读取的内容是字符或字节。那些字符或字节可以被解释为代表很多东西......但这是一个解释问题。此外,相同的字符序列可以表示不同的东西......取决于您选择来解释它们的方式;例如“12345”可以很容易地解释为字符串,整数或浮点数。如果您将其映射到Java类型,则可以是Stringshortintlongfloatdouble。还有更多。

    关键是......你(程序员)必须告诉解析器(例如Scanner)会发生什么。你不能指望它(正确地)猜测。

  2. 假设您已经设法读取为引用或(true)基元类型,您将无法将它们分配给同一个变量。 Integer等等不是原始类型!

  3. Scanner.readLine()方法以String的形式读取并返回当前行的其余部分。它没有试图解释它。结果的Java类型是String ......而没有别的。

  4. 那你该怎么做呢?那么这是一个原始版本的草图:

         String input = br.readLine();
         showPrimitive(input);  // Note spelling!
    
         public void showPrimitive(String input) {
             if (input.equalsIgnoreCase("true") ||
                 input.equalsIgnoreCase("false")) {
                 System.out.println("Primitive : boolean");
                 return;
             }
             try {
                 long num = Long.parseLong(input);
                 if (num >= Byte.MIN_VALUE && 
                     num <= Byte.MAX_VALUE) {
                     System.out.println("Primitive : byte");
                 } else if (num >= Short.MIN_VALUE &&
                            num <= Short.MAX_VALUE) {
                    System.out.println("Primitive : short");
                 } else if (num >= Integer.MIN_VALUE &&
                            num <= Integer.MAX_VALUE) {
                    System.out.println("Primitive : int");
                 } else {
                    System.out.println("Primitive : long");
                 }
                 return;
             } catch (NumberFormatException ex) {
                 // continue
             }
             // deal with floating point (c.f. above)
             // deal with char: input length == 1
             // anything else is a String.
         }
    

    请注意,上述内容需要以很多人会反对的方式使用异常。但是,如果要支持每种原始类型的所有可能值,那么做得更好是很棘手的。

    但我会回到我之前提出的观点。如果你看一下上面的代码,就可以做出有关如何解释输入的硬连线选择。但是你怎么知道你做出了正确的选择呢?答:您必须指定输入解析应该如何表现...不依赖别的东西来通过魔法给出“正确”的答案。