HSSFCell阅读空错误?

我一直在试图为一个志愿者项目编写一个Excel到JSON的转换器,但我一直遇到无法解释的错误,拒绝纠正。 这是我的错误:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at bin.parse.MembersParser.tryString(MembersParser.java:112) at bin.parse.MembersParser.parseFile(MembersParser.java:53) at bin.ParserFrame.actionPerformed(ParserFrame.java:61) at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.setPressed(Unknown Source) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) at java.awt.Component.processMouseEvent(Unknown Source) at javax.swing.JComponent.processMouseEvent(Unknown Source) at java.awt.Component.processEvent(Unknown Source) at java.awt.Container.processEvent(Unknown Source) at java.awt.Component.dispatchEventImpl(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Window.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.EventQueue.dispatchEventImpl(Unknown Source) at java.awt.EventQueue.access$500(Unknown Source) at java.awt.EventQueue$3.run(Unknown Source) at java.awt.EventQueue$3.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) at java.awt.EventQueue$4.run(Unknown Source) at java.awt.EventQueue$4.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source) 

我不能让它走开,不pipe我做了多less变化,所以这里是来源,也许别人能告诉我我做错了什么。

bin.Main:

 package bin; import javax.swing.JFrame; public class Main { static ParserFrame f; public static void main(String[] args) { f = new ParserFrame(); f.add(f.panel); f.setSize(800, 200); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); } } bin.ParserFrame: package bin; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.FileNotFoundException; import java.io.PrintWriter; import javax.swing.*; import bin.parse.*; @SuppressWarnings("serial") public class ParserFrame extends JFrame implements ActionListener { private JButton parse; private JLabel desc, inpt, oupt; private JTextField input, output; final JComboBox<String> menu; final int FIELDS_WIDTHS = 35; String[] CHOICES = {"Members", "MembersDues", "MembersLevel", "MembersAddresses", "MembersContact"}; private Parser p; public JPanel panel = new JPanel(); public ParserFrame() { desc = new JLabel("Select type of format to parse: "); menu = new JComboBox<String>(CHOICES); menu.setVisible(true); inpt = new JLabel("Select input source .xls file: "); input = new JTextField(FIELDS_WIDTHS); oupt = new JLabel("Select output location (end with .txt extension): "); output = new JTextField(FIELDS_WIDTHS); parse = new JButton("Parse the file."); parse.addActionListener(this); panel.setLayout(new GridLayout(4, 2)); panel.add(desc); panel.add(menu); panel.add(inpt); panel.add(input); panel.add(oupt); panel.add(output); panel.add(parse); } private void createButton() { parse = new JButton("Parse File"); parse.addActionListener(this); } @Override public void actionPerformed(ActionEvent e) { p = selectParser((String) menu.getSelectedItem()); String outputJSON = p.parseFile(input.getText()); try(PrintWriter out = new PrintWriter(output.getText())){ out.println(outputJSON); } catch (FileNotFoundException e1) { e1.printStackTrace(); } } private Parser selectParser(String selection) { switch (selection) { case "Members": return new MembersParser(); } return null; } } 

bin.parse.MembersParser:

 package bin.parse; import java.io.IOException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.CellType; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import bin.format.Members; public class MembersParser implements Parser { Gson g; List<Members> j = new ArrayList<Members>(); Members m = new Members(); HSSFWorkbook w = null; HSSFRow r = null; HSSFCell c = null; public MembersParser() { g = new GsonBuilder().setPrettyPrinting().setDateFormat("yyyy-MM-dd'T'HH:mm:ssz").create(); } public String parseFile(String inputLocation) { try { w = Parser.readFile(inputLocation); } catch (IOException e) { e.printStackTrace(); } HSSFSheet s = w.getSheetAt(0); for(int i = 1; i < s.getPhysicalNumberOfRows(); i++) { r = s.getRow(i); c = r.getCell(0); m.id = tryNumber(c); c = r.getCell(1); m.firstName = tryString(c); c = r.getCell(2); m.lastName = tryString(c); c = r.getCell(3); m.title = tryString(c); c = r.getCell(4); m.suffix = tryString(c); c = r.getCell(5); m.nickname = tryString(c); c = r.getCell(6); m.fullName = tryString(c); c = r.getCell(7); m.chapterName = tryString(c); c = r.getCell(8); m.gender = tryString(c); c = r.getCell(9); m.ageGroup = tryString(c); c = r.getCell(10); m.unit = tryNumber(c); c = r.getCell(11); m.level = tryString(c); c = r.getCell(12); m.levelDate = getDate(c); c = r.getCell(13); m.currentPosition = tryString(c); c = r.getCell(14); m.youthProtectionDate = getDate(c); j.add(m); } return g.toJson(m); } private String getString(HSSFCell c) { try { return c.getStringCellValue(); } catch (NullPointerException e) { e.printStackTrace(); } return ""; } private int getNumber(HSSFCell c) { try { return (int) c.getNumericCellValue(); } catch (NullPointerException e) { e.printStackTrace(); } return 0; } private Date getDate(HSSFCell c) { try { return c.getDateCellValue(); } catch (NullPointerException e) { e.printStackTrace(); } return null; } private String tryString(HSSFCell c) { if(c.getCellTypeEnum() == CellType.STRING) { return getString(c); } else if (c.getCellTypeEnum() == CellType.NUMERIC) { return String.valueOf(getNumber(c)); } else { return ""; } } private int tryNumber(HSSFCell c) { if(c.getCellTypeEnum() == CellType.NUMERIC) { return getNumber(c); } else if (c.getCellTypeEnum() == CellType.STRING) { return Integer.valueOf(getString(c)); } else { return 0; } } } 

注意:除了readFile()之外,parsing器父目前没有任何function。

bin.format.Members:

 package bin.format; import java.util.Date; /** * Holds the data from the Excel sheet and formats it for the JSON output. * * @version 1 */ public class Members { public int id; public String firstName; public String lastName; public String title; public String suffix; public String nickname; public String fullName; public String chapterName; public String gender; public String ageGroup; public int unit; public String level; public Date levelDate; public String currentPosition; public Date youthProtectionDate; } 

你的意思是你所有的行都被填充(从0到15)。 但在某些情况下,似乎并不是这样。

Nullpointer发生在tryString() ,所以我假设在某些情况下c是空的。

如果你只是添加

 if(c == null) { return ""; } 

在tryString(和其他tryXXX方法类似的东西)的开头,这应该是确定的。