有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么这一行是charg=(char)(br.read());被跳过?

在这个程序中,每当我运行程序时,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);
        }
    }
}

共 (3) 个答案

  1. # 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();
    
  2. # 2 楼答案

    尝试使用扫描仪,如中所示

         char g;
         Scanner scan = new Scanner (System.in);
         g = scan.nextChar();`
    
  3. # 3 楼答案

    问题是,您只从读卡器中读取了一个字符,而行分隔符部分仍有待读取

    因此,如果BufferedReader逻辑上包含:

    30\r\nm\r\n20
    

    然后:

    • 第一次调用readLine()将消耗"30\r\n"
    • 调用read()将消耗"m"而离开\r\n20
    • 第二次调用readLine()将消耗"\r\n",返回一个空字符串

    如果您实际上键入“30”,点击return,然后键入“m20”并点击return,它将起作用-但显然这不是您想要的:)

    要么使用扫描仪,要么只使用readLine()并对照“m”和“f”检查行的内容