如何避免java可执行jar中的nullpointerexception?

lokaqttq  于 2021-07-14  发布在  Java
关注(0)|答案(1)|浏览(518)

我最小化应用程序以再现错误。我使用java8和intellijswing设计器来制作这个最小的gui应用程序。

  1. public class MyGui {
  2. private JList<String> docList;
  3. private JPanel mainPanel;
  4. private DefaultListModel<String> listDocModel;
  5. public MyGui(){
  6. listDocModel = new DefaultListModel<>();
  7. try (InputStream resource = MyGui.class.getResourceAsStream("/data.csv");
  8. BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(resource, StandardCharsets.UTF_8))) {
  9. String line = "";
  10. while ((line = bufferedReader.readLine()) != null) {
  11. listDocModel.addElement(line);
  12. }
  13. } catch (IOException e) {
  14. System.out.println(e.getMessage());
  15. }
  16. docList.setModel(listDocModel); // I didn't initialize docList. But it works when run from the IDE.
  17. }
  18. public static void main(String[] args) {
  19. JFrame frame = new JFrame("MyGui");
  20. frame.setContentPane(new MyGui().mainPanel);
  21. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  22. frame.setPreferredSize( new Dimension( 800, 800));
  23. frame.pack();
  24. frame.setVisible(true);
  25. }
  26. }

后来我用maven汇编插件做了一个jar。当我以 java -jar myap.jar 我得到一个空指针异常:-
线程中出现异常

  1. "main" java.lang.NullPointerException
  2. at org.example.MyGui.<init>(MyGui.java:30)
  3. at org.example.MyGui.main(MyGui.java:38)

第30行是 docList.setModel(listDocModel); 所以我的问题是,为什么它可以通过ide工作,但不能通过jar工作呢。通过ide,我的列表中充满了如下数据:-

为了解决这个问题,我试着update:-

  1. docList = new JList<>(listDocModel);
  2. mainPanel = new JPanel();
  3. mainPanel.add(docList);

在这之后,我的名单不再是空的data:-

那么,我该如何用数据制作列表并制作一个可执行文件呢 jar ?
完全更新project:-
https://github.com/masiboo/swinggui

pprl5pva

pprl5pva1#

  1. // I didn't initialize docList. But it works when run from the IDE.

在这种情况下,ide才是问题所在。可能做一个“清理和构建”会把小精灵们甩出去,但是我不能提供对ide的支持。
这个 docList ( mainPanel 等等)都需要在使用前示例化。
除此之外,列表需要放在gui上可见的容器中,最好 Package 在滚动窗格中(如本例所示)。

最后一点注意:它在评论中指出,“文件加载很好”。这是一个很好的时机,将其从示例中排除,并使用硬编码数据,如下所示。下面的mre就是这样做的——所以任何人都可以运行它来查看它的工作(或者失败)。准备并张贴一个最小的可复制的例子,像这样的最好的帮助。

  1. import java.awt.*;
  2. import javax.swing.*;
  3. public class MyGui {
  4. // what happens in the IDE is irrelevant, this needs to be instantiated
  5. private JList<String> docList = new JList<>();
  6. // .. as does this
  7. private JPanel mainPanel = new JPanel(new BorderLayout());
  8. private DefaultListModel<String> listDocModel;
  9. // if the problem is not I/O related, factor it out by hard coding data
  10. private String[] data = {
  11. "Apples,are,Crunchy",
  12. "Oranges,are,Orange",
  13. "Bananas,are,Bent",};
  14. public MyGui() {
  15. listDocModel = new DefaultListModel<>();
  16. for (String line : data) {
  17. listDocModel.addElement(line);
  18. }
  19. // I didn't initialize docList. But it works when run from the IDE.
  20. // THEN THE IDE IS THE PROBLEM. Possibly fixed with a 'clean and build'.
  21. docList.setModel(listDocModel);
  22. // now add the list to the panel!
  23. mainPanel.add(new JScrollPane(docList));
  24. }
  25. public static void main(String[] args) {
  26. JFrame frame = new JFrame("MyGui");
  27. frame.setContentPane(new MyGui().mainPanel);
  28. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  29. // Avoid guesses, pack will produce the min size needed to display GUI
  30. //frame.setPreferredSize(new Dimension(..));
  31. frame.pack();
  32. frame.setVisible(true);
  33. }
  34. }
展开查看全部

相关问题