【发布时间】:2015-02-15 02:12:40
【问题描述】:
最初我有包含行的文本文件:
12
Steve Jobs 9 final 91
Bill Gates 6 midterm 90
James Gosling 3 midterm 100
James Gosling 3 final 100
Dennis Ritchie 5 midterm 94
Steve Jobs 9 midterm 95
Dennis Ritchie 5 final 100
Jeff Dean 7 midterm 100
Bill Gates 6 final 96
Jeff Dean 7 final 100
Sergey Brin 27 final 97
Sergey Brin 22 midterm 99
方法 public static Exam[] readAllExams(Scanner s) 创建并返回一个对象数组。 注意字符串'final'和'midterm'的第一个字母被转换成char。所以,当我运行readAllExams()时,结果是:
Steve Jobs 9 f 91
Bill Gates 6 m 90
James Gosling 3 m 100
James Gosling 3 f 100
Dennis Ritchie 5 m 94
Steve Jobs 9 m 95
Dennis Ritchie 5 f 100
Jeff Dean 7 m 100
Bill Gates 6 f 96
Jeff Dean 7 f 100
Sergey Brin 27 f 97
Sergey Brin 22 m 98
但是当我运行 public static Exam[] collateExams(Exam[] Exams) 时,它会在这一行中给我一个 NullPointerException:if(exams[i].getExamType()=='m')。 smb 可以解释/帮助我吗? 注意 getExamType() 返回一个字符。
import java.io.*;
import java.util.*;
class P2 {
public static void main(String [] args) throws FileNotFoundException
{
Scanner data = new Scanner(new File("Exam.txt"));
Exam[] readObjects = readAllExams(data);
Exam[] collateObjects = collateExams(readObjects);
System.out.println("1) Initially the list of exams of students is: ");
System.out.println();
for(int i = 0; i < readObjects.length; i++)
{
System.out.println(readObjects[i]);
}
System.out.println("Sorted list: ");
for (int i = 0; i < collateObjects.length; i++)
{
System.out.println(collateObjects[i]);
}
}
public static Exam[] readAllExams(Scanner s) throws ArrayIndexOutOfBoundsException
{
String firstName = "";
String lastName = "";
int ID = 0;
String examType = "";
char examTypeCasted;
int score = 0;
int index = 0;
Exam[] object = new Exam[s.nextInt()];
while(s.hasNext())
{
//Returns firtsName and lastName
firstName = s.next();
lastName = s.next();
//Returns ID number
if(s.hasNextInt())
{
ID = s.nextInt();
}
else
s.next();
//Returns examType which is 'M' or 'F'
examType = s.next();
examTypeCasted = examType.charAt(0);
if(s.hasNextInt())
{
score = s.nextInt();
}
//Exam[] object = new Exam[s.nextInt()];
object[index] = new Exam(firstName, lastName, ID, examTypeCasted, score);
//System.out.println();
index++;
}
readExam(s);
return object;
}
public static Exam readExam(Scanner s)
{
String firstName = "";
String lastName = "";
int ID = 0;
String examType = "";
char examTypeCasted = 0;
int score = 0;
while (s.hasNext())
{
//Returns firtsName and lastName
firstName = s.next();
lastName = s.next();
//Returns ID number
if(s.hasNextInt())
{
ID = s.nextInt();
}
//Returns examType which is 'M' or 'F'
examType = s.next();
examTypeCasted = examType.charAt(0);
if(s.hasNextInt())
{
score = s.nextInt();
}
}
Exam temp = new Exam(firstName, lastName, ID, examTypeCasted, score);
return temp;
}
public static Exam[] collateExams(Exam[] exams)
{
Exam [] r = new Exam[exams.length];
r = exams;
int [] position = new int[exams.length];
for(int i = 0;i < position.length;i++)
position[i]=-1;
int index = 0;
for(int i = 0; i < exams.length; i++)
{
if(exams[i].getExamType()=='m')
{
if(position[exams[i].getID()]==-1)
{
r[index*2]=new Exam(r[i].getFirstName(), r[i].getLastName(), r[i].getID(), r[i].getExamType(), r[i].getScore());
position[exams[i].getID()] = 2*index;
}
else r[2*position[exams[i].getID()] - 1]=new Exam(r[i].getFirstName(), r[i].getLastName(), r[i].getID(), r[i].getExamType(), r[i].getScore());
}
else
{
if(position[exams[i].getID()]==-1)
{
r[index*2+1] = new Exam(r[i].getFirstName(), r[i].getLastName(), r[i].getID(), r[i].getExamType(), r[i].getScore());
position[exams[i].getID()] = 2*index+1;
}
else r[2*position[exams[i].getID()]+1]=new Exam(r[i].getFirstName(), r[i].getLastName(), r[i].getID(), r[i].getExamType(), r[i].getScore());
}
index++;
}
return r;
/*Exam [] r = new Exam[100];
r = exams;
int[] position = new int[100];
int index = 0;
for(int i = 0; i < exams.length; i++)
{
if(r[i].getExamType() == 'm')
{
r[index] = new Exam(r[index].getFirstName(), r[index].getLastName(),
r[index].getID(), r[index].getExamType(), r[index].getScore());
position[index] = r[index].getID();
index+=2;
/*if((r[index+1].getExamType() == 'F') && (position[index+1] == r[i].getID()))
{
r[index+1] = new Exam(r[index].getFirstName(), r[index].getLastName(),
r[index].getID(), r[index].getExamType(), r[index].getScore());
}
/*if(position[i].getID() == r[i].getID())
r[i] = new Exam(r[i].getFirstName(), r[i].getLastName(),
r[i].getID(), r[i].getExamType(), r[i].getScore());
}
else if((r[index+1].getExamType() == 'f') && position[index] == r[i].getID())
{
r[index + 1] = new Exam(r[index].getFirstName(), r[index].getLastName(),
r[index].getID(), r[index].getExamType(), r[index].getScore());
}
}
return r;*/
}
}
【问题讨论】:
-
抱歉,这里是代码@Hovercraft Full Of Eels
-
如果
if(exams[i].getExamType()=='m')行抛出NPE,那么exams[i]为空。 -
如果您发布整个堆栈跟踪,我们或许能够找出为什么
exams[i]未初始化。 -
Exam [] r = new Exam[exams.length]; r = exams;这两行可以连接起来,例如Exam[] r = exams;,因为无论第一次赋值,r都将采用exams的值。 -
我怀疑通过说 r=exams,您是在尝试将考试数组的内容复制到 r 中,但事实并非如此。正如@TheJavaNot-So-Pro 上面指出的那样,r=exams 使 r 和 Exams 具有相同的值,即包含对同一个数组的相同引用。
标签: java