我正在创建一个应用程序,它将excel文件读入程序并对其进行操作。在此之前,一切都很好。但是,当我为我的应用程序实现GUI时,它不再起作用了。
这是代码:
当程序启动时,它会创建一个带按钮的gui并打开2个新的电子表格。我在这些电子表格中输入数据,然后按下调用crossReferenceButtonListener的按钮,但是无法获取数据。
下面的错误信息public GUI () throws Exception{
this.setTitle("NYWM Cross Reference Application");
this.setSize(400,100);
this.setVisible(true);
this.setLocationRelativeTo(null);
buttonHolder = new Panel (new BorderLayout());
this.add(buttonHolder);
crossReference = new Button ("CrossReference");
generateHPD = new Button ("Generate HPD");
buttonHolder.add(crossReference, BorderLayout.NORTH);
buttonHolder.add(generateHPD, BorderLayout.SOUTH);
crossReference.addActionListener(new crossReferenceButtonListener());
generateHPD.addActionListener(new generateHPDButtonListener());
createExcelSheet (log,"C:/Log.xlsx", "Log");
createExcelSheet(sheet,"C:/Spreadsheet.xlsx", "Spreadsheet");
}
private void createExcelSheet (XSSFWorkbook wb, String path, String fileName) throws Exception{
try{
FileOutputStream out = new FileOutputStream (path);
wb = new XSSFWorkbook ();
XSSFSheet sheet = wb.createSheet(fileName);
wb.write(out);
Process p = Runtime.getRuntime().exec(
"rundll32 url.dll, FileProtocolHandler " + path);
}
catch (Exception e){
throw e;
}
}
private class crossReferenceButtonListener implements ActionListener {
public void actionPerformed (ActionEvent event){
try {
ref = new CrossReference (log.getSheet("Log"), sheet.getSheet("Spreadsheet"));
ref.CrossReference();
JOptionPane.showMessageDialog(null, "Cross Reference was successful!");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
错误消息:更具体地说,它在此行失败
ref = new CrossReference (log.getSheet("Log"), sheet.getSheet("Spreadsheet"));
错误:
at java.awt.EventDispatchThread.run(Unknown Source)
java.lang.NullPointerException
at nywm_crossReferenceApplication.GUI$crossReferenceButtonListener.actionPerformed(GUI.java:70)
at java.awt.Button.processActionEvent(Unknown Source)
at java.awt.Button.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(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)
答案 0 :(得分:1)
尝试以下方法:
public GUI () throws Exception{
this.setTitle("NYWM Cross Reference Application");
this.setSize(400,100);
this.setVisible(true);
this.setLocationRelativeTo(null);
buttonHolder = new Panel (new BorderLayout());
this.add(buttonHolder);
crossReference = new Button ("CrossReference");
generateHPD = new Button ("Generate HPD");
buttonHolder.add(crossReference, BorderLayout.NORTH);
buttonHolder.add(generateHPD, BorderLayout.SOUTH);
// NOTE the order below has been flipped!!!!
createExcelSheet (log,"C:/Log.xlsx", "Log");
createExcelSheet(sheet,"C:/Spreadsheet.xlsx", "Spreadsheet");
crossReference.addActionListener(new crossReferenceButtonListener());
generateHPD.addActionListener(new generateHPDButtonListener());
}
在原始代码中,创建按钮,然后添加动作侦听器:
crossReference.addActionListener(new crossReferenceButtonListener());
但是,只有在添加crossReferenceButtonListener
之后才会调用createExcelSheet
,这是Workbook
实际被实例化的地方。并且crossReferenceButtonListener
想要使用Workbook
上的字段,但它们为空,因此您的NullPointerException
。
在添加createExcelSheet
之前调用crossReferenceButtonListener
方法,您将确保在log
之前创建了sheet
和crossReferenceButtonListener
试图使用'em。
答案 1 :(得分:1)
Java没有按引用调用语义。您将两个变量log
和sheet
传递给方法createExcelSheet
,显然希望它们在该方法中初始化但不起作用。方法调用后它们仍为null
。
createExcelSheet (log,"C:/Log.xlsx", "Log");
createExcelSheet(sheet,"C:/Spreadsheet.xlsx", "Spreadsheet");
您必须重写该方法以返回创建的XSSFWorkbook
并将调用更改为
log = createExcelSheet ("C:/Log.xlsx", "Log");
sheet = createExcelSheet("C:/Spreadsheet.xlsx", "Spreadsheet");