0

我是Java新手,所以如果这是一个很小的错误,请原谅我,这是
我的代码:

import java.io.*;
public class election
{
    public static void main(String args[])
    {
        boolean x=false;
        Ballot ballot=new Ballot();
        int n;
        while(x!=true)
        {
            System.out.println("Cast your vote to(1-5): ");
            try
            {
            n=System.in.read();
            System.out.flush();
            ballot.add(n);
            System.out.println("Enter 0 to exit, enter 1 to vote again: ");
            n = System.in.read();
            if(n==0)
            {
                x=true;
            }
            else
            {
                x=false;
            }
            }
            catch(IOException e)
            {
                System.out.println("I/O Error");
                System.exit(1);
            }
        }
    }
}
class Ballot
{
    int votes,spoilt;
    int cand[] = new int[5];

    //methods
    void add(int n)
    {
        votes=votes+1;
        if(n <= 5 && n>=1)
        {
            cand[n-1]=cand[n-1]+1;
        }
        else
        {
            spoilt = spoilt + 1;
        }
    }
    void display()
    {
        System.out.println("Total votes cast: " + votes);
        for(int i=0;i<5;i++)
        {
            System.out.println("Candidate " + (i+1) + ": " + cand[i]);
        }
        System.out.println("Spoilt: " + spoilt);
        System.out.println("Valid votes: " + (votes-spoilt));
    }
    Ballot()
    {
        votes=0;
        spoilt=0;
        for(int i=0;i<5;i++)
        {
            cand[i]=0;
        }
    }
}

当我在编译后运行它时,第 18 行(n = System.in.read()) 被跳过。
我得到的输出是这样的:

投票给(1-5):
1 输入0退出,输入1再次投票:
投票给(1-5):
2输入0退出,输入1再次投票:
投票给(1 -5):
^C

的值n不是read()使程序成为无限循环。

感谢您的帮助。

4

2 回答 2

6

我认为如果您使用 Scanner 类会更容易。您可以像这样实例化扫描仪对象Scanner scan = new Scanner(System.in);。然后第 18 行可以变成n = scan.nextInt();这应该正确读取用户输入。有关 Scanner 类的更多信息,请参阅 Java 文档:http ://docs.oracle.com/javase/6/docs/api/java/util/Scanner.html 。希望这有帮助。

于 2013-03-09T05:05:52.023 回答
3

System.in.read()仅读取一个字节,但是标准输入流仅在您按“Enter”时刷新。因此,在第一次调用返回时,有两个字节要读取('1', '\n')。正常返回,然后'1'在下一次调用时'\n'返回。

我还应该指出,读取的值并未int像您期望的那样转换为。'1'例如,将是49十进制或32十六进制。您可以尝试通过减法来转换它'0',但正如其他人指出的那样,最好使用更高级别的函数来输入整数。

于 2013-03-09T05:05:59.667 回答