所以我正在为类赋值,在我完成并修复了所有错误后,编译器发现我在运行程序时得到了这个:
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);
}
}
使用input.nextInt()
时,它不会使用结束输入的换行符。结果是,当您提示输入下一个输入(状态)时,它会立即读取剩余的换行符,将空字符串指定给State
,并提示输入门牌号。您应该使用input.nextLine()
来读取邮政编码(以及稍后的门牌号),并将该行解析为int
。或者,调用nextLine()
,并在调用nextInt()
之后忽略返回值。
我建议邮政编码可能只是一个字符串,这样您就可以保留前导零,并可以处理zip+4地址。同样,门牌号码应该是一个字符串,用于处理贝克街221b号等地址。当然,这需要更改Address
类的定义以及读取输入的方式。
您应该在使用input.nextInt()
之后使用input.nextLine()
,以便使用缓冲区中剩余的换行符。如果使用input.nextLine()
并尝试将其直接解析为int,那么如果该行不是整数,则可能会得到异常,因此需要捕获异常。你可以这样做:
System.out.println();
System.out.print("What is your zip code?t");
Zip = input.nextInt();
input.nextLine();
当您键入邮政编码时,比如说12345,您还输入回车。input.nextInt();吃12345,下面的输入.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");
第一个:
在您的地址类中:
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.next line()来转储新行。
不那么快但稍微不那么脏的解决方案:
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勇气:)