我一直得到一个异常线程"main":
java.lang.ArithmeticException: / by zero
at PersonalityTest.percentage(PersonalityTest.java:85)
at PersonalityTest.main(PersonalityTest.java:19)
我想把每次扫描器读取A或B的计数加起来,得到B的百分比
import java.io.*;
import java.util.*;
public class PersonalityTest {
public static final int dimen = 4;
public static void main(String [] args) throws FileNotFoundException {
Scanner input = new Scanner(new File("personality.txt"));
PrintStream out = new PrintStream(new File("output.txt"));
int[] a = new int[4];
int[] b = new int[4];
welcome();
while (input.hasNextLine()) {
String letter = letter(input, out);
countNum(a, b, out, letter);
int[] percentage = percentage(a, b, out);
type(out, percentage);
out.println("");
}
}
public static void welcome () {
System.out.println("The Keirsey Temperament Sorter is a test that measures four independent dimensions of your personality: ");
System.out.println("1. Extrovert versus Introvert (E vs. I): what energizes you");
System.out.println("2. Sensation versus iNtuition (S vs. N): what you focus on");
System.out.println("3. Thinking versus Feeling (T vs. F): how you interpret what you focus on");
System.out.println("4. Judging versus Perceiving (J vs. P): how you approach life");
System.out.println("");
}
public static String letter (Scanner input, PrintStream out) {
String name = input.nextLine();
out.println(name + ":");
String letter = input.nextLine();
return letter;
}
public static void countNum(int[] a, int[] b, PrintStream out, String letter) {
int[] countA = new int[7];
int[] countB = new int[7];
int n = 0;
out.print("answers: [");
for (int i = 0; i < letter.length(); i++) {
int type = i % 7;
if (letter.charAt(i) == 'A' || letter.charAt(i) == 'a') {
n = 1;
}
else if (letter.charAt(i) == 'B' || letter.charAt(i) == 'b') {
n = 1;
}
countA[type] += n;
countB[type] += n;
if (type == 2 || type == 4 || type == 6) {
a[type / 2] = countA[type - 1]+ countA[type];
b[type / 2] = countB[type - 1]+ countA[type];
} else if (type == 0) {
a[0] = countA[0];
b[0] = countB[0];
}
for (int j = 0; j < dimen; j++) {
out.print(a[j] + "A-" + b[j] + "B," + " ");
}
}
out.print("]");
}
public static int[] percentage (int[] a, int[] b, PrintStream out) {
int[] percentage = new int [4];
out.print("percent B: [");
double n = 0.0;
for (int i = 0; i < dimen; i++) {
n = b[i] * 100 / (a[i] + b[i]); // <--- This is where I get error
percentage [i] = (int) Math.round(n);
out.print(percentage[i]);
}
out.print("]");
return percentage;
}
public static void type (PrintStream out, int[] percentage) {
String[] type = new String [4];
out.print("type: ");
for (int i = 0; i <= dimen; i++) {
while (percentage[i] > 50) {
if (i == 0) {
type[1] = "I";
}
else if (i == 1) {
type[2] = "N";
}
else if (i == 2) {
type[3] = "F";
}
else {
type[4] = "P";
}
}
while (percentage[i] < 50) {
if (i == 0) {
type[1] = "E";
}
else if (i == 1) {
type[2] = "S";
}
else if (i == 2) {
type[3] = "T";
}
else {
type[4] = "J";
}
}
out.print(Arrays.toString(type));
}
}
}
你的逻辑很难跟随所有的a, b, +1, -1,/2等。您应该尝试将其减少到能够演示问题的最小代码量。当你这样做的时候,你很有可能会发现问题。您还可以提供一些示例输入。没有其中一个或两个,很难帮助你解决问题。
更新:我看到了一些看起来像问题的事情,现在我看到你在努力做什么。除非我弄错了,您的输入文件在第一行上有一个名称,然后是70行,每行上有一个字母?
一方面,当读取一个字母并将其发送到countNum()中时,你只有一个名为"n"的变量,无论你看到a还是B,你都要增加它,然后你将"n"加到a和B上,这不是在a的数量或B的数量上加1。它总是会给它们加1。
接下来,由于只向countNum()发送一个字母,所以外部for循环只执行一次。这意味着你只需要将一个值放入a[0]和b[0]中。此外,由于"n"问题,两个值总是为1。因此,当您进入内部for循环时,它将始终为答案的第一部分打印"1A-1B, 0A-0B, 0A-0B, 0A-0B"。
之后,你的percentage()方法不起作用的原因就很明显了。除了数组的第一个位置以外,其他位置都为0。
附加内容:您定义了一个常数"dimen"等于4,但有时使用该常数,有时使用字面量"4"。选择一个并坚持下去。我建议使用常量,并且我建议将其命名为一些有意义的东西,如"NUMBER_OF_PERSONALITY_DIMENSIONS",如果它是这样的话。因此,给你所有的变量起一个更好的名字,这样对你和我来说都更容易。此外,在你的type()方法中,你说for ( int i = 0; i <= dimen; i++ ) {
迭代一个我认为只有4个元素的数组。它会断裂的。最后,正如你在其他地方提到的,不要传递数组,在多个不同的方法中改变它们。那是很容易迷路的。一般来说,使方法无副作用。而不是修改你传递给他们的东西,从方法中返回重要的值。
我不知道你是否学过这种东西,但是你可以考虑把它分成两个类:一个读入数据,一个统计数据。计数的可能看起来像这样:
class Tallier {
private int numberOfAs;
private int numberOfBs;
private int totalEntriesSoFar;
private int[] typeATotals;
private int[] typeBTotals;
public void gotNewA() {...}
public void gotNewB() {...}
}
你在除以零,问题是。在上述行中,您有:
n = b[ i ] * 100 / ( a[ i ] + b[ i ] );
有时,a[i]+b[i]为零。也许这个问题可以通过这样的检查来解决:
for( int i = 0; i < dimen; i++ ) {
if (a[ i ] + b[ i ]!= 0)
n = b[ i ] * 100 / ( a[ i ] + b[ i ] );
else
//assign a number to n for this situation
percentage [ i ] = ( int ) Math.round( n );
out.print( percentage[ i ] );
}
但是逻辑上,你不应该把一个数字除以零。那也许你得修正你的算法了