System.out.print同时打印两行/题。我究竟做错了什么?

时间:2014-10-14 21:58:20

标签: java java.util.scanner system.out

所以我正在为课程分配工作,在我完成并修复了编译器发现的所有错误后,我在运行程序时得到了这个:

  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);
    }

}

4 个答案:

答案 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勇气:)