我正在编写一个家庭作业程序,所有内容最终都被编译但是我遇到了一些我不确定如何解释的运行时错误。
import java.util.Scanner;
import java.lang.Math;
public class A1
{
public static void main(String [] args)
{
float ex, mid, bonus, cheat, a1, a2, a3, a4, a5, a6, a7, grade,A;
float Jb=0;
String name;
String letGr="NA";
Scanner scanner = new Scanner(System.in);
System.out.println("Please input grades");
String line = scanner.nextLine();
String data[] = line.split("|");
name = data[0];
ex = Float.parseFloat(data[1]);
mid = Float.parseFloat(data[2]);
bonus = Float.parseFloat(data[3]);
cheat = Float.parseFloat(data[4]);
a1 = Float.parseFloat(data[5]);
a2 = Float.parseFloat(data[6]);
a3 = Float.parseFloat(data[7]);
a4 = Float.parseFloat(data[8]);
a5 = Float.parseFloat(data[9]);
a6 = Float.parseFloat(data[10]);
a7 = Float.parseFloat(data[11]);
A = (a1+a2+a3+a4+a5+a6+a7)/320;
grade = 0.5f * ex + 0.1f *mid + 0.1f * A + bonus + Jb;
if (ex < 40)
grade += 0.3 * ex;
else
if (ex > 50)
grade += 0.2 * Math.max(ex, mid) + 0.1 * Math.max(ex, A);
else
grade += 0.02 * ((ex - 40) * Math.max(ex, mid) + (50 - ex) * ex)
+ 0.01 * ((ex - 40) * Math.max(ex, A) + (50 - ex) * ex);
if (mid < 40)
grade = Math.min(grade, mid);
if (A < 50)
grade = Math.min(grade, A);
if (cheat >= 1)
grade = 0;
if (grade >= 94)
letGr = ("A+");
if (grade >= 87 && grade < 94)
letGr = ("A");
if (grade >= 80 && grade < 87)
letGr = ("A-");
if (grade >= 77 && grade < 80)
letGr = ("B+");
if (grade >= 73 && grade < 77)
letGr = ("B");
if (grade >= 70 && grade < 73)
letGr = ("B-");
if (grade >= 67 && grade < 70)
letGr = ("C+");
if (grade >= 63 && grade < 67)
letGr = ("C");
if (grade >= 60 && grade < 63)
letGr = ("C-");
if (grade >= 57 && grade < 60)
letGr = ("D+");
if (grade >= 53 && grade < 57)
letGr = ("D");
if (grade >= 50 && grade < 53)
letGr = ("D-");
if (grade < 50)
letGr = ("F");
System.out.println(line);
}
}
当数据以形式送入程序时 John Q. Woodcutter | 75 | 82 | 2 | 0 | 15 | 57 | 55 | 56 | 10 | 25 | 48我收到错误
java.lang.NumberFormatException: For input string: "J"
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1222)
at java.lang.Float.parseFloat(Float.java:422)
at A1.main(A1.java:17)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:272)
我不确定该怎么做,因为你可以看到我需要读入的值才能进行后期的等级计算,但是到了哪里去了。我也尝试使用分隔符来打破字符串,因为它被读入但无法使该方法工作。我意识到这是很多代码,我不希望任何人做我的作业,我只是在寻找一些提示,如果我正确地使用Float.parseFloat方法,那么从哪里开始。
感谢您提供的任何帮助
答案 0 :(得分:3)
String data[] = line.split("|");
split()
采用正则表达式,|
是正则表达式中的特殊字符。要拆分文字管道,请逃离管道。
String data[] = line.split("\\|");
使用"|"
会导致每个字符被拆分,这就是parseFloat
抱怨你传递字符串"J"
的原因。 split("|")
等同于split("")
,每当“找到”一个空字符串时,它就会分割字符串。如果你仔细想想,每个角色之间都有一个空字符串。