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)
相关推荐
希望高手指点
Exception in thread "main" java.lang.NullPointerException at com.example.YourClass.yourMethod(YourClass.java:XX) ``` 其中,`YourClass`是你程序中的类名,`yourMethod`是引发异常的方法名,`XX`是异常发生...
Java线程是多任务编程中的核心概念,它允许程序同时执行多个不同的任务,极大地提高了程序的效率和响应性。在Java中,线程是通过`Thread`类或实现`Runnable`接口来创建和管理的。本课件"thread.rar"包含的视频教程,...
在Java编程语言中,`NullPointerException` 是一个常见的运行时异常,它发生在试图访问或操作一个值为null的对象引用时。这个异常表示程序试图通过一个null引用调用方法或访问字段,而实际上该引用并没有指向任何...
Exception in thread "main" java.lang.NullPointerException at java.lang.ProcessBuilder.start(ProcessBuilder.java:1010) at org.apache.hadoop.util.Shell.runCommand(Shell.java:482) at org.apache....
Exception in thread "main" java.lang.NullPointerException at ClassDemo03.main(ClassDemo03.java:12) ``` ##### 解决方法: 1. **初始化对象**:在使用对象之前确保其已被正确初始化。 #### 四、`...
将其放入hadoop/bin下,可解决java.lang.NullPointerException at java.lang.ProcessBuilder.start(Unknown Source),Exception in thread "main" java.lang.UnsatisfiedLinkError:等异常
java运行中出现空指针异常Exception in thread "main" java.lang.NullPointerException at BrowserViewer.makeButton(BrowserViewer.java:310) at BrowserViewer.makeNavigationPanel(BrowserViewer.java:217) ...
2. **Exception in thread "main" java.lang.ArithmeticException: / by zero**:这表示你在代码中执行了一个除以零的操作。要避免这个异常,需要在进行除法运算之前检查除数是否为零。 3. **...
#### 二、`Exception in thread "main" java.lang.ArithmeticException: / by zero` **原因**:当执行除法运算时,除数为0,会导致此异常被抛出。 **解决方法**: - 在执行除法操作前,检查除数是否为0。 - 可以...
Exception in thread "main" Exception executing consequence for rule "extended" in fr.cea.test: java.lang.NullPointerException at org.drools.core.runtime.rule.impl.DefaultConsequenceExceptionHandler....
所有的checked exception是从java.lang.Exception类衍生出来的,而runtime exception则是从java.lang.RuntimeException或java.lang.Error类衍生出来的。 它们的不同之处表现在两方面:机制上和逻辑上。 一...
运行时异常是指程序运行过程中可能出现的非正常状态,例如 NullPointerException、ArrayIndexOutOfBoundsException 等,Java 编译器不要求方法声明抛出运行时异常。一般异常是指方法可能抛出的异常,例如 ...
Exception in thread "main" java.lang.NullPointerException at ExceptionDemo.main(ExceptionDemo.java:4) ``` ##### 9.1.2 异常的分类 Java中的异常可以分为两大类:`Error`和`Exception`,它们都继承自`...
Exception in thread "main" java.lang.NullPointerException at MyClass.method1(MyClass.java:5) at MyClass.method2(MyClass.java:10) ... ``` #### (2) `printStackTrace(PrintStream)` 和 `printStackTrace...
GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收...
Error 和 Exception 都是 java.lang.Throwable 的子类。Error 表示由 JVM 所侦测到的无法预期的错误,这些错误是 JVM 层次的严重错误,导致 JVM 无法继续执行,因此,这是不可捕捉的,无法采取任何恢复的操作,一般...
GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收...
《Java面试宝典2011版》涵盖了Java面试中常见的各类问题,旨在帮助求职者深入理解Java语言的核心概念及编程技巧。以下是对文件中提到的一些关键知识点的详细解析: ### 1. Java源文件中类的数量限制 在一个`.java`...