1

このプログラムでは、char g = (char)(br.read())プログラムを実行するたびに行がスキップされます。年齢を入力した後、性別をmと入力すると、エラーjava.lang.NumberFormatExceptionが発生します。

import java.io.*;
public class Tax
{
    public static void main()throws IOException
    {
        InputStreamReader isr  = new InputStreamReader(System.in);
        BufferedReader br = new BufferedReader(isr);
        System.out.println("Enter age");
        int age = Integer.parseInt(br.readLine());
        System.out.println("Enter gender as m or f");
        char g = (char)(br.read());
        System.out.println("Enter Taxable Income");
        int ti = Integer.parseInt(br.readLine());
        double in;
        if (age > 65 || g == 'f')
        System.out.println("Wrong Category");
        else
        {
            if (ti <= 160000)
            in = 0;
            else if(ti > 160000 && ti<=500000)
            in = (ti - 160000) * (10.0/100.0);
            else if(ti > 500000 && ti<=800000)
            in = (ti - 50000) * (20.0/100.0) + 34000;
            else
            in = (ti - 800000) * (30.0/100.0) + 94000;
            System.out.println("Income Tax = " + in);
        }
    }
}

しかし、プログラムが以下のように変更された場合、つまり、char g = (char)(br.read());に置き換えられた場合String g = br.readLine()、それは機能します

import java.io.*;
public class Tax
{
    public static void main()throws IOException
    {
        InputStreamReader isr  = new InputStreamReader(System.in);
        BufferedReader br = new BufferedReader(isr);
        System.out.println("Enter age");
        int age = Integer.parseInt(br.readLine());
        System.out.println("Enter gender as m or f");
        String g = br.readLine();
        System.out.println("Enter Taxable Income");
        int ti = Integer.parseInt(br.readLine());
        double in;
        if (age > 65 || g.equalsIgnoreCase("f"))
        System.out.println("Wrong Category");
        else
        {
            if (ti <= 160000)
            in = 0;
            else if(ti > 160000 && ti<=500000)
            in = (ti - 160000) * (10.0/100.0);
            else if(ti > 500000 && ti<=800000)
            in = (ti - 50000) * (20.0/100.0) + 34000;
            else
            in = (ti - 800000) * (30.0/100.0) + 94000;
            System.out.println("Income Tax = " + in);
        }
    }
}
4

3 に答える 3

6

問題は、リーダーから 1 文字しか読み取っていないことです。行区切り部分はまだ読み取られていません。

したがって、BufferedReader論理的に含まれている場合:

30\r\nm\r\n20

それで:

  • readLine()初めて呼び出すと が消費されます"30\r\n"
  • 呼び出すと、離れるread()ことが消費されます"m"\r\n20
  • 2 回目に呼び出すreadLine()と が消費さ"\r\n"れ、空の文字列が返されます

実際に「30」と入力してリターンを押し、次に「m20」と入力してリターンを押すと、機能しますが、明らかにそれはあなたが望むものではありません:)

スキャナーを使用するか、単に使用readLine()して行の内容を "m" と "f" に対してチェックします。

于 2013-01-09T18:17:04.690 に答える
2

のようにスキャナーを使用してみてください

     char g;
     Scanner scan = new Scanner (System.in);
     g = scan.nextChar();`
于 2013-01-09T18:16:53.973 に答える
0

あなたは1バイトしか読んでいません。つまり、次のようなものを書いた場合

m 22

このメニューでは、数字の前にスペースがあり、入力すると

m
22

これは、その後の行の残りmが空白であることを意味します。

これは私がそれを書く方法です

Scanner in  = new Scanner(System.in);
System.out.println("Enter age");
int age = in.nextInt(); in.nextLine();
System.out.println("Enter gender as m or f");
String mf = in.next(); in.nextLine();
System.out.println("Enter Taxable Income");
int ti = in.nextInt(); in.nextLine();
于 2013-01-09T18:18:22.950 に答える