如何更正此程序以防止它抛出java.lang.NumberFormatException?

时间:2016-08-09 12:48:17

标签: java

所以这是我为学校写的程序:

import java.io.*;
public class p35{
public static void main()throws IOException
{
    InputStreamReader isr = new InputStreamReader(System.in);
    BufferedReader br = new BufferedReader(isr);
    System.out.println("Enter c for circle,r for rectangle and t for triangle");

    char a = (char)br.read();
    switch(a)
    {
        case 'c': System.out.println("Enter radius");
                  String r = br.readLine();
                  int rad = Integer.parseInt(r);
                  System.out.println("area of circle is:"+(22/7)*(rad*rad));
                  break;
        case 'r': System.out.println("Enter length");
                  String l = br.readLine();
                  int len = Integer.parseInt(l);

                  System.out.println("Enter breadth");
                  String bd = br.readLine();
                  int breadth = Integer.parseInt(bd);
                  System.out.println("area of rectangle is: "+len*breadth);
                  break;
        case 't': System.out.println("Enter base");
                  String b = br.readLine();
                  int bas = Integer.parseInt(b);

                  System.out.println("Enter height");
                  String h = br.readLine();
                  int htg = Integer.parseInt(h);
                  System.out.println("area of triangle is: "+(1/2)*bas*htg);
                  break;
        }
    }
}

它似乎不起作用并抛出java.lang.NumberFormatException。 有人可以帮我纠正吗? p.s我不允许使用异常处理,所以你可以试着帮助我而不使用它吗? 感谢

3 个答案:

答案 0 :(得分:0)

由于您似乎开始编程,我将建议采用以下方法。

您应解析输入并验证其编号。 将输入分解为字符数组 检查每个字符是否是数字(在'1'到'0'之间,或者是。或空格)

这是避免异常的一种简单方法。如果输入有效,则处理它,如果不是,则显示输出,格式无效。

答案 1 :(得分:0)

你可以做些什么来确保它是一个数字就是这样:

if(!string.replaceAll("[^0-9]", "").isEmpty()) 

如果你的字符串是一个数字,这只会继续。如果你想检查双打,那就更难了,但是我可以,这里有一段代码解释如何。

Pattern pattern = Pattern.compile("[0-9]{1,}\\.[0-9]{1,}?");

这是你需要检查的模式,对于“双”格式,它基本上是说任何数字0-9 1或更多次然后一个点然后更多数字0-9 1或更多次,这是什么双是。

希望这有助于你得到关于如何做到这一点的答案,同样,对于双重检查,你可以使用pattern.matcher(string).matches()返回,如果它是双倍的

答案 2 :(得分:0)

这是因为您捕获用户输入的方式。基本上,当您创建输入流阅读器并调用read方法时,它会提示用户输入。但是,当您稍后调用readLine()时,它仍然在相同的第一行(字符和返回)上运行。这就是你收到这条消息的原因:

Exception in thread "main" java.lang.NumberFormatException: For input string: ""

您可以通过在阅读完字符后完成“消耗”第一行输入来修复代码:

char a = (char) br.read();
br.readLine(); // this finishes consuming the first line of input

不要使用输入流,而应考虑使用为此类目的而制作的Scanner类。

public static void main(String[] args) throws Exception {
    Scanner in = new Scanner(System.in);
    System.out.println("Enter c for circle,r for rectangle and t for triangle");
    String input = in.next();
    if (!input.isEmpty()) {
        char a = input.charAt(0);
        switch (a) {
            case 'c':
                System.out.println("Enter radius (int)");
                int rad = in.nextInt();
                System.out.println("area of circle is: " + (22 / 7) * (rad * rad));
                break;
            case 'r':
                System.out.println("Enter length (int)");
                int len = in.nextInt();
                System.out.println("Enter breadth (int)");
                int breadth = in.nextInt();
                System.out.println("area of rectangle is: " + len * breadth);
                break;
            case 't':
                System.out.println("Enter base (int)");
                int bas = in.nextInt();
                System.out.println("Enter height (int)");
                int htg = in.nextInt();
                // Note change to calculation
                System.out.println("area of triangle is: " + bas * htg / 2);
                break;
        }
    }
}

仅供参考,最后要注意的是你的三角形计算被打破了。因为你在这里使用整数,所以它将会进行算术运算。 (1/2)始终为0,因此您的区域将始终为0.如果您想要int结果,请先乘以乘以然后除以2。如果您希望它更准确地计算,请先将其转换为双精度数。对于圆半径也是如此,但由于22/7不会舍入为0,因此不太糟糕。

使他们成双打的例子:

(22.0 / 7) * rad * rad

注意22上的.0。这将使第一部分成为双重结果,而双倍的int也是双精度,因此你将获得双精度而不是整数精度。