0 0

出现以下错误,请那位帮忙解决. Exception in thread "main" java.lang.NullPointerException 15

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)

2010年12月23日 12:37

3个答案 按时间排序 按投票排序

0 0

引用
Exception in thread "main" java.lang.NullPointerException
at AttendanceManager.work(Starter.java:324)
at Starter.main(Starter.java:364)


这个已经说的很明确了,查下这个类的324行了,看下是那个对象为空了null还要取其属性或是方法!

2010年12月28日 09:39
0 0

这种问题打个断点就出来了,自己尝试着自己解决,不要遇到个问题就拿出来问。

2010年12月23日 13:18
0 0

  debug 自己一步步走 看哪里调用了为null 的地方

2010年12月23日 13:04

相关推荐

    Exception in thread "main" java.lang.NullPointerException

    希望高手指点

    java 空指针异常(NullPointerException)

    Exception in thread "main" java.lang.NullPointerException at com.example.YourClass.yourMethod(YourClass.java:XX) ``` 其中,`YourClass`是你程序中的类名,`yourMethod`是引发异常的方法名,`XX`是异常发生...

    Java课件\thread.rar

    Java线程是多任务编程中的核心概念,它允许程序同时执行多个不同的任务,极大地提高了程序的效率和响应性。在Java中,线程是通过`Thread`类或实现`Runnable`接口来创建和管理的。本课件"thread.rar"包含的视频教程,...

    详解Java中NullPointerException异常的原因详解以及解决方法

    在Java编程语言中,`NullPointerException` 是一个常见的运行时异常,它发生在试图访问或操作一个值为null的对象引用时。这个异常表示程序试图通过一个null引用调用方法或访问字段,而实际上该引用并没有指向任何...

    hadoop-2.6.0-hadoop.dll-winutils.exe

    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....

    Java常见异常和错误[定义].pdf

    Exception in thread "main" java.lang.NullPointerException at ClassDemo03.main(ClassDemo03.java:12) ``` ##### 解决方法: 1. **初始化对象**:在使用对象之前确保其已被正确初始化。 #### 四、`...

    hadoop.dll,hadoop.lib,winutils.exe等

    将其放入hadoop/bin下,可解决java.lang.NullPointerException at java.lang.ProcessBuilder.start(Unknown Source),Exception in thread "main" java.lang.UnsatisfiedLinkError:等异常

    java浏览器代码报错

    java运行中出现空指针异常Exception in thread "main" java.lang.NullPointerException at BrowserViewer.makeButton(BrowserViewer.java:310) at BrowserViewer.makeNavigationPanel(BrowserViewer.java:217) ...

    Java中常见错误和异常解决方法.doc

    2. **Exception in thread "main" java.lang.ArithmeticException: / by zero**:这表示你在代码中执行了一个除以零的操作。要避免这个异常,需要在进行除法运算之前检查除数是否为零。 3. **...

    Java中常见错误和异常解决方法(打印).doc

    #### 二、`Exception in thread "main" java.lang.ArithmeticException: / by zero` **原因**:当执行除法运算时,除数为0,会导致此异常被抛出。 **解决方法**: - 在执行除法操作前,检查除数是否为0。 - 可以...

    DROOLS_NPE_rule_extended

    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....

    Java精华(免费版)

    所有的checked exception是从java.lang.Exception类衍生出来的,而runtime exception则是从java.lang.RuntimeException或java.lang.Error类衍生出来的。   它们的不同之处表现在两方面:机制上和逻辑上。   一...

    华为java面试题.doc

    运行时异常是指程序运行过程中可能出现的非正常状态,例如 NullPointerException、ArrayIndexOutOfBoundsException 等,Java 编译器不要求方法声明抛出运行时异常。一般异常是指方法可能抛出的异常,例如 ...

    java 异常处理

    Exception in thread "main" java.lang.NullPointerException at ExceptionDemo.main(ExceptionDemo.java:4) ``` ##### 9.1.2 异常的分类 Java中的异常可以分为两大类:`Error`和`Exception`,它们都继承自`...

    解析Java异常的栈轨迹及其相关方法

    Exception in thread "main" java.lang.NullPointerException at MyClass.method1(MyClass.java:5) at MyClass.method2(MyClass.java:10) ... ``` #### (2) `printStackTrace(PrintStream)` 和 `printStackTrace...

    超级有影响力霸气的Java面试题大全文档

     GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收...

    运行时异常与一般异常的区别?

    Error 和 Exception 都是 java.lang.Throwable 的子类。Error 表示由 JVM 所侦测到的无法预期的错误,这些错误是 JVM 层次的严重错误,导致 JVM 无法继续执行,因此,这是不可捕捉的,无法采取任何恢复的操作,一般...

    java 面试题 总结

     GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收...

    Java面试宝典2011版

    《Java面试宝典2011版》涵盖了Java面试中常见的各类问题,旨在帮助求职者深入理解Java语言的核心概念及编程技巧。以下是对文件中提到的一些关键知识点的详细解析: ### 1. Java源文件中类的数量限制 在一个`.java`...

Global site tag (gtag.js) - Google Analytics