运行Java程序的错误

我想用netbeans运行我的java程序,我得到这个错误,任何建议?

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at javax.swing.ImageIcon.(ImageIcon.java:181) at MainForm.addComponentsToPane(MainForm.java:28) at MainForm.createAndShowGUI(MainForm.java:112) at MainForm.access$000(MainForm.java:15) at MainForm$4.run(MainForm.java:125) at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:641) at java.awt.EventQueue.access$000(EventQueue.java:84) at java.awt.EventQueue$1.run(EventQueue.java:602) at java.awt.EventQueue$1.run(EventQueue.java:600) at java.security.AccessController.doPrivileged(Native Method) at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) at java.awt.EventQueue.dispatchEvent(EventQueue.java:611) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) at java.awt.EventDispatchThread.run(EventDispatchThread.java:122) 

这是代码:

 import java.awt.Color; import java.awt.Container; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; public class MainForm { public static void addComponentsToPane(final JFrame frame, Container pane) { Color colorGreen = new Color(0, 100, 0); Color colorBrown = new Color(150, 100, 0); //Color colorBlue = new Color (0, 0, 150); //Font font = new Font("Verdana", Font.BOLD, 12); pane.setLayout(null); pane.setBackground(new Color (255, 255, 170)); //add image and necessary labels on top left corner //SHA Image and label ImageIcon image = new ImageIcon(MainForm.class.getResource("SHA_logo.gif")); JLabel label = new JLabel("Office of Traffic & Safety", image, JLabel.LEFT); label.setVerticalTextPosition(JLabel.BOTTOM); label.setHorizontalTextPosition(JLabel.CENTER); label.setFont(new Font("Times New Roman", Font.PLAIN, 11)); pane.add(label); label.setBounds(50, 10, 130, 100); label.setBorder(null); //university of maryland image and label\\\ image = new ImageIcon(MainForm.class.getResource("maryland_flag_round.gif")); label = new JLabel("Univ. of Maryland", image, JLabel.LEFT); label.setVerticalTextPosition(JLabel.BOTTOM); label.setHorizontalTextPosition(JLabel.CENTER); label.setFont(new Font("Times New Roman", Font.PLAIN, 11)); pane.add(label); label.setBounds(190, 10, 130, 90); label.setBorder(null); //critical lane label label = new JLabel("Critical Lane Volume"); label.setFont(new Font("Arial Narrow", Font.BOLD, 30)); label.setForeground(colorGreen); pane.add(label); label.setBounds(50, 90, 250, 50); label.setBorder(null); label = new JLabel("Please choose the analysis type:"); label.setFont(new Font("Arial", Font.BOLD, 18)); label.setForeground(colorBrown); pane.add(label); label.setBounds(25, 130, 300, 70); label.setBorder(null); //back and exit buttons JButton button1 = new JButton("Interchange"); JButton button2 = new JButton ("Intersection"); JButton button3 = new JButton ("Exit"); pane.add(button1); pane.add(button2); pane.add(button3); button1.setBounds(75, 200, 200, 50); button2.setBounds(75, 270, 200, 50); button3.setBounds(75, 340, 200, 50); //add attap label at bottom left image = new ImageIcon(MainForm.class.getResource("attap_logo.gif")); label = new JLabel(image); pane.add(label); label.setBounds(30, 380, 270, 90); label.setBorder(null); button1.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0) { frame.setVisible(false); frame.dispose(); InterchangeLoad.main(null); } }); button2.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0) { frame.setVisible(false); frame.dispose(); MultipleIntersectionLoad.main(null); } }); button3.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0) { frame.setVisible(false); frame.dispose(); } }); } private static void createAndShowGUI() { //Create and set up the window. JFrame frame = new JFrame("Critical Lane Volume"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Set up the content pane. addComponentsToPane(frame, frame.getContentPane()); frame.setSize(350, 500); frame.setResizable(false); frame.setVisible(true); } public static void main(String[] args) { //Schedule a job for the event-dispatching thread: //creating and showing this application's GUI. javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } }); } } 

看起来您传递给ImageIcon构造函数的一个(或多个)参数为null。

编辑

例外情况发生在以下两条线之一:

 ImageIcon image = new ImageIcon(MainForm.class.getResource("SHA_logo.gif")); 

要么

 image = new ImageIcon(MainForm.class.getResource("maryland_flag_round.gif")); 

在任何一种情况下,问题都是相同的:找不到资源,因此getResource()返回null 。 你为什么不只是使用new ImageIcon(String filename) ? 我甚至不能100%确定getResource()正在做什么。

关于您的代码的一些其他快速评论(建议):

pane.setLayout(null); 不是一个好主意,我甚至不确定你是否可以像这样摆脱LayoutManager。

对不同的对象重复使用相同的引用( imagelabel )是错误的编码风格。 你不是通过这样做来节省任何内存,而且代码没那么正确。

使用更具描述性的名称! button1应该被称为’interchangeButton’或沿着这些行的东西。 对于如此小的代码段,没有人会迷失方向,但如果你曾经在一个更大的项目上工作,那么一个好的命名方案至关重要。