我试图让程序识别是否未输入int。
我见过以下所有内容:
if (v % 1)
到
parseInt();
但他们不适合我。
import java.util.Scanner;
public class LinearSlopeFinder {
public static void main(String[]args){
double x1, y1, x2, y2, n1, equation, constant = 0 ;
double slope, slope1, slopeAns;
Scanner myScanner = new Scanner(System.in);
System.out.print(" What is the first set of cordinants? example: x,y ... ");
String coordinate1 = myScanner.nextLine();
//below is what i am referring to
if (coordinate1 != int ){ // if it is a double or String
System.out.println("Sorry, you must use whole numbers.What is the first set of cordinants? example: x,y ... ");
System.out.print(" What is the first set of cordinants? example: x,y ... ");
String coordinate1 = myScanner.nextLine();
}
答案 0 :(得分:6)
检查值是否是这样的原语是行不通的。 Java将无法以这种方式将值与类型进行比较。
一种方法是利用静态函数Integer.parseInt(String s)
来查看是否输入了适当的int值。请注意,它会抛出NumberFormatException
。如果您可以利用这一事实,您可以获得是否从函数提供了整数。
try {
//Attempt the parse here
} catch (...) {
//Not a proper integer
}
第二种技术(因为您已经在利用Scanner
类)是使用Scanner
methods hasNextInt()
和nextInt()
来确定如果:
Scanner
在流示例用法是:
if (myScanner.hasNextInt()) {
int totalAmount = myScanner.nextInt();
// do stuff here
} else {
//Int not provided
}
正如您在更新中提到的,当Scanner
的输入分隔空格时,这一切都很好。默认情况下,Scanner按空格分隔流中的值。当你有一个不同的分隔符(例如:“,”或“//”等)在逻辑上在流上分隔两个唯一值时会发生什么?
解决方法是修改Scanner
正在使用的分隔符。有一个名为useDelimiter(String pattern)
的方法,它允许您指定如何在流中逻辑分隔值。它对于你正在处理的事情(或任何空格不划分值的情况)非常有用。
用法看起来像这样:
Scanner myScanner = ...; # Get this how you normally would
String delimiter = ...; # Decide what the separator will be
myScanner.useDelimiter(delimiter); # Tell the Scanner to use this separator
在Scanner
API中有一个很好的示例(请参阅我在该示例中包含的Scanner
上的第一个链接),其中介绍了如何使用它。我建议检查一下,它会很好地为你(我相信)聚会。
答案 1 :(得分:2)
又一个解决方案,让您有选择:在JLS §3.10.1中,您可以读取整数。将定义放在正则表达式中,您有:
// input s
if (s.matches("(?i)[+-]?(0|[1-9][0-9]*|0[x][0-9a-f]+|0[0-7]+)L?")) { /* do something */}
缺点是,你在代码中添加了一个详细的数字定义--Java可以为你做到这一点。但是,奖励是你的案例2,3
很容易解决:
String intLiteral = "[+-]?(0|[1-9][0-9]*|0[x][0-9a-f]+|0[0-7]+)L?";
// input s
if (s.matches("(?i)" + intLiteral + "," + intLiteral)) { /* do something */}
(事情不会那么容易,因为你可能也喜欢2, 3
之类的字符串也有效 - 但我会把它留给你。)
回到常用的解决方案和关于2,3
的评论,你必须养成分离问题的习惯:你已经知道了几种检查字符串是否包含整数的方法。你现在可以做的就是单独留下这个问题并解决你的逗号:
String s = "2,3";
String[] parts = s.split(","); // here we deal with commas
try {
// now when we have parts, deal with parts separately
System.out.println("First: " + Integer.parseInt(parts[0]));
System.out.println("Second: " + Integer.parseInt(parts[1]));
} catch (NumberFormatException e) {
System.out.println("There was a problem, you know: " + e.getMessage());
}
答案 2 :(得分:1)
您可以使用Integer.parseInt(yourInt)
,但是如果您没有收到整数,则必须捕获引发的错误,如下所示:
try {
Integer.parseInt(yourInt);
}
catch (NumberFormatException e) {
// do something that indicates to the user that an int was not given.
}
答案 3 :(得分:0)
if (coordinate1 != int)
不起作用,因为您将值与类型进行比较。这段代码甚至不应该编译。
使用:
try {
int integer = Integer.parseInt(value);
} catch (NumbumberFormatException e) {
// Not an integer
}
答案 4 :(得分:0)
使用此模型:
Integer result = null;
try {
result = Integer.valueOf(input);
} catch (NumberFormatException e) {}
if (result != null) {
// An integer was entered
}
Integer.valueOf会为带有deciamls的数字抛出异常,所以你不应该有任何问题。我正在使用Integer类vs int,因此可以将其设置为null。使用-1表示无法输入-1。
答案 5 :(得分:0)
您可以尝试使用的一种方法是新方法。这是我用来获取整数输入的一个:
public static int getIntInput(Scanner s) { // Just put your scanner into here so that the method can read inputs without creating a new scanner each time
System.out.print("Enter int here: ");
try {
return Integer.parseInt(s.nextLine());
} catch (NumberFormatException e) {
System.out.println("You must enter a valid Integer literal.");
return getIntInput(s); // Note that this line just repeats the try statement all over again.
}
如果输入是整数,则返回int;否则,它会再次尝试。注意:添加一个计数器,以便在有人在您的回车键上设置午餐包时代码不会中断。