System.out.print正在同时打印两行/两个问题.我做错了什么



所以我正在为类赋值,在我完成并修复了所有错误后,编译器发现我在运行程序时得到了这个:

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

最新更新