我必须检查每个输入,如果它是原语或引用的类型的实例,则打印出来。但我每次都得到相同的输出。
注意:我搜索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
答案 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
存在一些误解。
您从输入流中读取的内容是字符或字节。那些字符或字节可以被解释为代表很多东西......但这是一个解释问题。此外,相同的字符序列可以表示不同的东西......取决于您选择来解释它们的方式;例如“12345”可以很容易地解释为字符串,整数或浮点数。如果您将其映射到Java类型,则可以是String
,short
,int
,long
,float
或double
。还有更多。
关键是......你(程序员)必须告诉解析器(例如Scanner
)会发生什么。你不能指望它(正确地)猜测。
假设您已经设法读取为引用或(true)基元类型,您将无法将它们分配给同一个变量。 Integer
等等不是原始类型!
Scanner.readLine()
方法以String的形式读取并返回当前行的其余部分。它没有试图解释它。结果的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.
}
请注意,上述内容需要以很多人会反对的方式使用异常。但是,如果要支持每种原始类型的所有可能值,那么做得更好是很棘手的。
但我会回到我之前提出的观点。如果你看一下上面的代码,就可以做出有关如何解释输入的硬连线选择。但是你怎么知道你做出了正确的选择呢?答:您必须指定输入解析应该如何表现...不依赖别的东西来通过魔法给出“正确”的答案。