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

Check if input is of Primitive type in Java?

我必须检查每个 输入 并打印出它是否是 原始类型或引用 类型的实例。但是我每次都得到相同的输出。

注意:我搜索过 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

您将输入分配给 String 变量。这将是一个字符串。

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

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

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

参见documentation for BufferedReader

public String readLine()
                throws IOException

它returns一个String,不管输入实际包含什么。

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


一种可能的方法(如果有内置或现有方法,我不知道)是反复尝试将输入转换为您要检查的每种数据类型。如果 none 匹配,则打印 "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 ,或者当它可以放入 int 时,您可以说它是 double(例如输入是 5, 检查它是一个整数,然后再检查它是 double).

在我回答你的问题之前,你似乎对 Java 和 Scanner.

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

    重点是……您(程序员)必须告诉解析器(例如 Scanner)期望什么。你不能指望它猜对(正确)。

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

  3. Scanner.readLine() 方法读取并 return 将当前行的其余部分作为字符串读取。它没有试图解释它。结果的 Java 类型是 String ... 没有别的。


那么你应该如何实现它。那么这是一个粗略版本的草图:

     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.
     }

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

但我会 return 回到我之前提出的观点。如果您查看上面的代码,它正在对如何解释输入做出 hard-wired 选择。但是你怎么知道你是否做出了正确的选择?答案:您必须 指定 输入解析的行为方式...而不是依赖其他东西来给您魔术般的 "right" 答案。