检查 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
.
有很多误解
你从输入流中读取的东西是字符或字节。那些字符或字节可以被解释为代表很多东西……但这是一个解释问题。此外,相同的字符序列 可能 表示不同的意思……这取决于您 选择 的方式来解释它们;例如“12345”很容易被解释为字符串、整数或浮点数。如果将其映射到 Java 类型,则可能是 String
、short
、int
、long
、float
或 double
...还有更多。
重点是……您(程序员)必须告诉解析器(例如 Scanner
)期望什么。你不能指望它猜对(正确)。
假设您 已经 设法读取为引用或(真正的)原始类型,您将无法将它们分配给同一个变量。 Integer
等等不是原始类型!
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" 答案。
我必须检查每个 输入 并打印出它是否是 原始类型或引用 类型的实例。但是我每次都得到相同的输出。
注意:我搜索过 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
.
你从输入流中读取的东西是字符或字节。那些字符或字节可以被解释为代表很多东西……但这是一个解释问题。此外,相同的字符序列 可能 表示不同的意思……这取决于您 选择 的方式来解释它们;例如“12345”很容易被解释为字符串、整数或浮点数。如果将其映射到 Java 类型,则可能是
String
、short
、int
、long
、float
或double
...还有更多。重点是……您(程序员)必须告诉解析器(例如
Scanner
)期望什么。你不能指望它猜对(正确)。假设您 已经 设法读取为引用或(真正的)原始类型,您将无法将它们分配给同一个变量。
Integer
等等不是原始类型!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" 答案。