Exception in thread "main" java.lang.NullPointerException

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

/**
* 考勤管理类
*/
class AttendanceManager {

/**
* CSV中的文件条目
*/
class Item {
/** 计算机名 */
private String computerNum;

/** 登录状态 */
private String loginStatus;

/** 签到状态 */
private String signatureStatus;

/** 学生名 */
private String studentName;

/**
* 根据一个字符串来初始化一个Item对象
*
* @param string
*/
public Item(String string) {
initByString(string);
}

public String getComputerNum() {
return computerNum;
}

public String getLoginStatus() {
return loginStatus;
}

public String getSignatureStatus() {
return signatureStatus;
}

public String getStudentName() {
return studentName;
}

/**
* 通过字符串初始化对象
*
* @param string
*/
private void initByString(String string) {
String args[] = string.split(",");

String info = null;
for (int i = 0; i < args.length; i++) {
info = args[i];
switch (i) {
case 0:
setComputerNum(info);
break;
case 1:
setStudentName(info);
break;
case 2:
setLoginStatus(info);
break;

case 3:
setSignatureStatus(info);
break;

default:
break;
}
}
}

public void setComputerNum(String computerNum) {
this.computerNum = computerNum;
}

public void setLoginStatus(String loginStatus) {
this.loginStatus = loginStatus;
}

public void setSignatureStatus(String signatureStatus) {
this.signatureStatus = signatureStatus;
}

public void setStudentName(String studentName) {
this.studentName = studentName;
}
}

/**
* 结果对象
*/
class Result {

/**
* 学生信息类
*/
class Student {
/** 出勤次数 */
private Integer signatureCount;

/** 学生姓名 */
private String studentName;

public Student(String studentName, Integer signatureCount) {
this.studentName = studentName;
this.signatureCount = signatureCount;
}

public int compareTo(Student student) {
if (student.getSignatureCount() == signatureCount) {
return 0;
} else if (student.getSignatureCount() > signatureCount) {
return 1;
} else if (student.getSignatureCount() < signatureCount) {
return -1;
}
return 0;
}

public Integer getSignatureCount() {
return signatureCount;
}

public String getStudentName() {
return studentName;
}

public void setSignatureCount(Integer signatureCount) {
this.signatureCount = signatureCount;
}

public void setStudentName(String studentName) {
this.studentName = studentName;
}
}

private Map<String, Integer> resultMap = new HashMap<String, Integer>();

/** 考勤总天数(文件个数) */
private int totalDay;

/**
* 增加
*
* @param item
*/
public void add(Item item) {
if (item.getStudentName().startsWith("N"))
return;

if (resultMap.containsKey(item.getStudentName())) {
resultMap.put(item.getStudentName(), resultMap.get(item
.getStudentName()) + 1);
} else {
resultMap.put(item.getStudentName(), new Integer(1));
}
}

public int getTotalDay() {
return totalDay;
}

public void setTotalDay(int totalDay) {
this.totalDay = totalDay;
}

@Override
public String toString() {
List<Student> students = new LinkedList<Student>();
for (Map.Entry<String, Integer> entry : resultMap.entrySet()) {
students.add(new Student(entry.getKey(), entry.getValue()));
}

// 排序
Collections.sort(students, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o1.compareTo(o2);
}
});

StringBuffer sb = new StringBuffer();
sb.append("学生姓名,\t出勤次数,\t 缺勤次数,\t出勤分数\n");
for (Student student : students) {
sb.append(student.getStudentName());
sb.append(",\t");
sb.append(student.getSignatureCount());
sb.append(",\t");
sb.append(totalDay - student.getSignatureCount());
sb.append(",\t");

Float scoreFloat = (100F - (totalDay - student
.getSignatureCount())
* (100F / totalDay));
int length = Math.min(4, scoreFloat.toString().length());
sb.append(scoreFloat.toString().substring(0, length));
sb.append("%\n");
}
String returnString = sb.toString();
return returnString;
}
}

/** 考勤文件夹路径 */
private String filesDir;

/** 标识是否执行成功 */
private boolean isWorkSuccess;

/** 结果对象 */
private Result result = new Result();

/** 结果字符串 */

public String getFilesDir() {
return filesDir;
}

/**
* 获取结果
*/
public Result getResult() {
if (!isWorkSuccess) {
throw new RuntimeException("请先执行work函数,或work时出错!");
}

return result;
}

/**
* 判断是否为考勤文件中 具体的学生考勤信息
*
* @param readLine
* @return
*/
private boolean isData(String readLine) {
if (null == readLine || 0 == readLine.length())
return false;

// 如果字符串以 "N" 开头,则认为为具体数据
if (readLine.startsWith("N")) {
return true;
}
return false;
}

/**
* 分析单个考勤文件
*
* @param file
* 考勤文件
*/
private void parse(File file) {
try {
// 一行一行地读取
BufferedReader reader = new BufferedReader(new InputStreamReader(
new FileInputStream(file)));

String lineData = null;
while (true) {
lineData = reader.readLine();

if (null == lineData)
break;

// 如果不是学生数据,则换成
if (!isData(lineData))
continue;

Item item = new Item(lineData);
result.add(item);
}
} catch (Exception e) {
System.out.println("解析文件" + file.getName() + "时发生错误!");
e.printStackTrace();
}
}

public void setFileDir(String fileDir) {
this.filesDir = fileDir;
}

/**
* 设置考勤文件所在路径
*
* @param filesDir
* 文件路径
*/
public void setFilesDir(String filesDir) {
this.filesDir = filesDir;
}

/**
* 解析
*/
public void work() {
String path = getFilesDir();
System.out.println(path);
File filesPath = new File(path);
File[] files = filesPath.listFiles();
result.setTotalDay(files.length);

for (File file : files) {
parse(file);
}
isWorkSuccess = true;
}

/**
* 写入到文件
*
* @param filePath
* 文件路径
* @throws FileNotFoundException
*/
public void writeToFile(String filePath) throws FileNotFoundException {
PrintWriter writer = new PrintWriter(new File(filePath));
writer.println(result.toString());
writer.close();
}

}

public class Starter {
/**
* 学生考勤系统的设计和实现 具有如下功能:
* 1、根据教师提供的excel考勤文件夹,统计学生出勤次数,缺勤次数,出勤分数(设考勤次数为N次,满勤为100分,缺勤1次扣总分的1/N),并按分数排序。
* 2、统计结果在屏幕上显示出来,并保存到文本文件.txt之中。
*
*
* 分析:文件格式为CSV, 内容格式为: 计算机名,学生名,登录状态,签到状态
*
* @throws IOException
*/
public static void main(String[] args) {
AttendanceManager attendanceManager = new AttendanceManager();

// 设置考勤文件所在路径
attendanceManager
.setFilesDir("C:\\07级2班点名2009.csv");

// 分析
attendanceManager.work();

// 获取结果
System.out.println(attendanceManager.getResult());

// 写入到文件
try {
attendanceManager.writeToFile("c:/c.txt");
} catch (FileNotFoundException e) {
System.err.println("写入文件错误!");
e.printStackTrace();
}
}
}

出现以下错误,请那位帮忙解决.
Exception in thread "main" java.lang.NullPointerException
at AttendanceManager.work(Starter.java:324)
at Starter.main(Starter.java:364)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值