所以我正在为课程分配工作,在我完成并修复了编译器发现的所有错误后,我在运行程序时得到了这个:
J:\Java Class>java AddressDemo
What is your Street's name? Unknown RD
What is your zip code? 1234565
What is your State?
What is your house number?
它同时询问这两个问题并等待输入。
这是我的代码:
import java.util.Scanner;
public class AddressDemo
{
public static void main(String[] args)
{
Address address = new Address();
Scanner input = new Scanner(System.in);
String Street;
int Zip;
String State;
String City;
int house;
// Get the student's input
System.out.println();
System.out.print("What is your Street's name?\t");
Street = input.nextLine();
System.out.println();
System.out.print("What is your zip code?\t");
Zip = input.nextInt();
System.out.println();
System.out.print("What is your State?\t");
State = input.nextLine();
System.out.println();
System.out.print("What is your house number?\t");
house = input.nextInt();
System.out.println();
System.out.print(" What is your city?\t");
City = input.nextLine();
// Processing
address.setStName(Street);
address.setZNum(Zip);
address.setSName(State);
address.setCName(City);
address.setHNum(house);
//Output isn't finished
System.out.println("\nYour address is:" + address.getHNum() + address.getStName() + address.getCName() +address.getSName()
+ address.getZNum() + " !");
}
}
这是我需要的其他文件的代码:
public class Address
{
private int HNum;
private String StName;
private String CName;
private String SName;
private int ZNum;
private String LNum;
public boolean setHNum (int hn)
{
HNum = hn;
return true;
}
public String getHNum()
{
return String.format("%08d", HNum);
}
public boolean setStName(String str)
{
StName = str;
return true;
}
public String getStName()
{
return StName;
}
public boolean setCName(String City)
{
CName = City;
return true;
}
public String getCName()
{
return CName;
}
public boolean setSName(String st)
{
SName = st;
return true;
}
public String getSName()
{
return SName;
}
public boolean setZNum ( int zip)
{
ZNum = zip;
return true;
}
public String getZNum()
{
return String.format("%08d", ZNum);
}
public boolean setLNum (String l2)
{
LNum = l2;
return true;
}
public String getLNum()
{
return String.format("%08d", LNum);
}
}
答案 0 :(得分:3)
使用input.nextInt()
时,它不会使用结束输入的换行符。结果是,当您提示下一个输入(状态)时,它会立即读取剩余的换行符,将空字符串分配给State
,并提示输入门牌号。您应该使用input.nextLine()
来读取邮政编码(以及稍后的门牌号)并将该行解析为int
。或者,在调用nextLine()
后调用nextInt()
并忽略返回值。
我想建议邮政编码应该只是一个字符串,这样你就可以保留前导零并且可以处理zip + 4地址。同样,门牌号码应该是一个字符串来处理像贝克街221b这样的地址。当然,这将需要更改Address
类定义以及更改读取输入的方式。
答案 1 :(得分:1)
使用input.nextLine()
后,您应该使用input.nextInt()
,以便使用缓冲区中剩余的换行符。如果使用input.nextLine()
并尝试直接将其解析为int,如果该行不是整数,则可能会出现异常,因此您需要捕获异常。你可以这样做:
System.out.println();
System.out.print("What is your zip code?\t");
Zip = input.nextInt();
input.nextLine();
答案 2 :(得分:1)
当您输入邮政编码时,请输入12345,您也可以输入回车符。 input.nextInt();吃12345,以下input.nextLine();吃回车,这就是你的程序跳到门牌号码的原因。
以下是解决方案:
System.out.print("What is your zip code?\t");
Zip = input.nextInt();
input.next line();
System.out.println();
System.out.print("What is your State?\t");
State = input.nextLine();
System.out.println();
System.out.print("What is your house number?\t");
答案 3 :(得分:1)
第一:
在您的地址类中:
public boolean setStName(String str)
{
StName = str;
return true;
}
不需要布尔返回,因为您没有在任何地方使用该返回值。所以你的函数应该是这样的:( void表示没有返回值)。
public void setStName(String str)
{
StName = str;
第二:
System.out.println()将打印出你给它的内容,然后在结尾处添加一个换行符,而System.out.print()将只打印你给它的内容......考虑一下:
System.out.println("Hello1");
System.out.print("Hello2");
System.out.print("Hello3");
System.out.print("Hello4");
System.out.println("Hello5");
System.out.println("Hello6");
System.out.print("Hello7");
System.out.println("Hello8");
将输出:
Hello1
Hello2Hello3Hello4Hello5
Hello6
Hello7Hello8
-
第三:
这就是为什么我真的很讨厌Java以这种方式教给初学者程序员的事实,就是从控制台读取输入并不那么简单,因为Scanner.nextInt()并不那么简单。
好的,所以......
Scanner.nextLine()从输入控制台读取一个字符串,直到它到达“新行”符号(也就是说,你按下回车键),然后它在进程中吃掉了新的行符号。但Scanner.nextInt()只会尝试读取一个数字,并在遇到不是数字的内容(如“新行”字符)时停止,并将其保留在输入缓冲区中。
您的Scanner.nextInt()调用有效,但您的下一个nextLine()调用永远不会获得任何输入,因为nextInt()调用从System.in获取了所有数字,但它没有取出新行。您的以下nextLine()调用仅查找下一个新行字符,并立即找到它...
这是快速而超级肮脏的解决方案:
在每个Scanner.nextInt()之后添加一个额外的Scanner.nextLine()来转储新行。
不那么快但稍微不那么脏的解决方案:
System.in由字符串作为文本组成。所以不要跳枪,不要立即假设你收到的文字是一个数字......首先把它作为文本处理,然后检查一下它是否是一个数字......
在你的例子中:
System.out.println();
System.out.print("What is your house number?\t");
house = input.nextInt();
我们这样做:
System.out.println("What is your house number?");
String houseNumberString = input.nextLine();
house = Integer.parseInt(houseNumberString);
input.nextLine()将为您提供键盘输入,直到用户按Enter键为止。
Integer.parseInt()将尝试解密文本String,并将其转换为整数。
bon勇气:)