Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么会导致Swing应用程序不一致地抛出空指针异常?_Java_Swing - Fatal编程技术网

Java 什么会导致Swing应用程序不一致地抛出空指针异常?

Java 什么会导致Swing应用程序不一致地抛出空指针异常?,java,swing,Java,Swing,我有一个两类的项目,一类读取一个文件,并对照网站检查所述文件中的每个条目,然后将返回数据发布到另一个文件中 如果返回数据为true(例如),则文件中的数据点将在屏幕上闪烁。此功能可以正常工作 我在while循环中通过下面的if语句调用它 if (!query.text().contains("unavailable") && !query.text().contains("at least 3 characters long to acquire.") && li

我有一个两类的项目,一类读取一个文件,并对照网站检查所述文件中的每个条目,然后将返回数据发布到另一个文件中

如果返回数据为true(例如),则文件中的数据点将在屏幕上闪烁。此功能可以正常工作

我在while循环中通过下面的if语句调用它

if (!query.text().contains("unavailable") && !query.text().contains("at least 3 characters long to acquire.") && line != null) {

            HitBox h = new HitBox(line); //GUI Class.

            fos.write(query.text().getBytes());
            fos.write("\n".getBytes());

            fos.flush();

        }
下面是我的GUI类

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.IOException;

import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JWindow;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
import javax.swing.UIManager;

public class HitBox {
    private Timer t;
    JWindow frame = new JWindow();
    public HitBox(String s) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager
                            .getSystemLookAndFeelClassName());
                } catch (Exception ex) {
                }

                frame.setAlwaysOnTop(true);

                t = new Timer(1000 * 5, new ActionListener() {
                    public void actionPerformed(ActionEvent e2) {
                        SwingUtilities.getWindowAncestor(frame.getComponent(0))
                        .dispose();
                    }
                });

            }

        });
        frame.setBackground(new Color(0, 0, 0, 0));
        TranslucentPane tp = new TranslucentPane(s);
        frame.setContentPane(tp);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        t.start();

    }


}
class TranslucentPane extends JPanel {

    public TranslucentPane(String s) {
        add(new JLabel(s));
        setOpaque(false);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        Graphics2D g2d = (Graphics2D) g.create();
        g2d.setComposite(AlphaComposite.SrcOver.derive(0.85f));
        g2d.setColor(getBackground());
        g2d.fillRect(0, 0, getWidth(), getHeight());


    }

}
使用相同的输入数据集时会发生这种情况,即使我重写web查询,只返回一个设置值,@a random point in runtime,将出现一个JWindow,将抛出一个null指针(@my call of the start method of my timer object)

这让我相信我错误地实现了计时器;我很感兴趣的是,对于一致的数据和返回,它抛出空指针的点是如何变化的

Exception in thread "main" java.lang.NullPointerException
at HitBox.<init>(HitBox.java:51)
at OriginalGangster.main(OriginalGangster.java:38)
线程“main”java.lang.NullPointerException中的异常 在HitBox。(HitBox.java:51) 在OriginalGangster.main(OriginalGangster.java:38)
您没有在GUI线程上启动GUI。您需要将其移动到可运行状态,并确保在构建后启动计时器

e、 g


代码已更新

  • 主代码已被移动到公共静态方法,因为这似乎是向用户显示消息而不与任何其他代码共享状态的代码,类似于JOptionPane消息,所以我使其行为类似于JOptionPane
  • 计时器的ActionListener已移出构造函数以保持清洁
  • 添加了alpha合成、显示时间和消息字体点大小的参数

    • 您没有在GUI线程上启动GUI。您需要将其移动到可运行状态,并确保在构建后启动计时器

      e、 g


      代码已更新

      • 主代码已被移动到公共静态方法,因为这似乎是向用户显示消息而不与任何其他代码共享状态的代码,类似于JOptionPane消息,所以我使其行为类似于JOptionPane
      • 计时器的ActionListener已移出构造函数以保持清洁
      • 添加了alpha合成、显示时间和消息字体点大小的参数

      哪一行是HitBox的第51行,如图所示:
      在HitBox.(HitBox.java:51)
      ?还要注意,contentPane应该始终是不透明的,而你的则不是。正如我所说,第51行是“@my call of the start method of my timer object.”所以t.start():)哪一行是HitBox的第51行,如图所示:
      在HitBox.(HitBox.java:51)
      ?还要注意,contentPane应该始终是不透明的,而您的则不是。正如我所说,第51行是“@my call of the start method of my timer object.”所以t.start():)这是一条非常有效的语句,我的错,我还注意到我在runnable中调用了一个计时器,这毫无意义。您是否看到(您或我发现的问题)导致问题的原因?酷,移动obj。创建到runnable,并用timer out修复它。谢谢。@EricLang:不,计时器也会在美国东部夏令时正常启动。代码做了一些修改。这是一个非常有效的语句,我的错,我还注意到我在runnable中调用了一个计时器,这毫无意义。您是否看到(您或我发现的问题)导致问题的原因?酷,移动obj。创建到runnable,并用timer out修复它。谢谢。@EricLang:不,计时器也会在美国东部夏令时正常启动。代码有点变化。
      import java.awt.AlphaComposite;
      import java.awt.Color;
      import java.awt.EventQueue;
      import java.awt.Font;
      import java.awt.Graphics;
      import java.awt.Graphics2D;
      import java.awt.event.ActionEvent;
      import java.awt.event.ActionListener;
      
      import javax.swing.JLabel;
      import javax.swing.JPanel;
      import javax.swing.JWindow;
      import javax.swing.Timer;
      import javax.swing.UIManager;
      
      public class TestHitBox {
         public static void main(String[] args) {
            String text = "Hello world! This is Hovercraft!";
            int seconds = 5;
            float composite = 0.85f;
            float points = 48f;
            HitBox.showMessage(text, seconds, composite, points);
         }
      }
      
      class HitBox {
      
         public static void showMessage(final String text, final int seconds, final float composite, final float points) {
            EventQueue.invokeLater(new Runnable() {
               @Override
               public void run() {
                  try {
                     UIManager.setLookAndFeel(UIManager
                           .getSystemLookAndFeelClassName());
                  } catch (Exception ex) {
                     ex.printStackTrace();
                  }
                  final JWindow frame = new JWindow();
                  frame.setBackground(new Color(0, 0, 0, 0));
                  TranslucentPane tp = new TranslucentPane(text, composite, points);
                  frame.setContentPane(tp);
                  frame.pack();
                  frame.setLocationRelativeTo(null);
                  frame.setVisible(true);
      
                  frame.setAlwaysOnTop(true);
                  new Timer(1000 * seconds, new TimerListener(frame)).start();
               }
            });
         }
      }
      
      class TimerListener implements ActionListener {
         private JWindow frame;
      
         public TimerListener(JWindow frame) {
            this.frame = frame;
         }
      
         @Override
         public void actionPerformed(ActionEvent e) {
            frame.dispose();
            ((Timer) e.getSource()).stop();
         }
      }
      
      @SuppressWarnings("serial")
      class TranslucentPane extends JPanel {
         private float composite;
      
         public TranslucentPane(String s, float composite, float points) {
            this.composite = composite;
            JLabel label = new JLabel(s);
            label.setFont(label.getFont().deriveFont(Font.BOLD, points));
            add(label);
            setOpaque(false); // this breaks a rule
         }
      
         @Override
         protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.setComposite(AlphaComposite.SrcOver.derive(composite));
            g2d.setColor(getBackground());
            g2d.fillRect(0, 0, getWidth(), getHeight());
            g2d.dispose(); // dispose of any graphics we create
         }
      }