所以这是我为学校写的程序:
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我不允许使用异常处理,所以你可以试着帮助我而不使用它吗? 感谢
答案 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也是双精度,因此你将获得双精度而不是整数精度。