【问题标题】:The program is giving thread error exception程序给出线程错误异常
【发布时间】:2020-03-25 09:42:26
【问题描述】:

当我点击提交按钮时,什么也没有发生 我创建了一个程序来制作一个计数器,我们可以在其中添加时间,当我以秒为单位输入时间并单击提交按钮时它不起作用

import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import java.lang.*;
public class CountdownTimer extends Thread 
{
    JTextField tf,tf2;
    JLabel l1,l2;
    JFrame fr;
    JButton b;
    String n;
    int t;
    public void run()
    {
        buildGUI();
    }
    public void buildGUI()
    {
        fr = new JFrame("Countdown Timer");
        JPanel p = new JPanel();
        l2 = new JLabel("Please Enter the Time:");
        l1 = new JLabel("");
        tf2 = new JTextField(8);
        tf2.setEnabled(true);
        tf2.setBackground(Color.white);
        p.setBackground(Color.white);  
        JButton b=new JButton("Submit");  
        b.setEnabled(true);
        b.setVisible(true);
        fr.add(p);
        p.add(l2);
        p.add(tf2);
        p.add(b);
        fr.setVisible(true);
        fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        fr.setSize(300,200);
        fr.setResizable(false);
        n = tf2.getText();
        fr.setSize(300,200);
        t = Integer.parseInt(n);
        b.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                tf = new JTextField(15);
                tf.setEnabled(false);
                b.setVisible(false);
                tf2.setVisible(false);
                l2.setVisible(false);
                Font f = new Font("Verdana", 0, 18);
                tf.setFont(f);
                tf.setBackground(Color.white);
                tf.setVisible(true);
                p.add(tf);
                for(int i = t;i>=0;i--)
                {
                    try
                    {
                          Thread.sleep(1000);
                          String s = Integer.toString(i);
                          tf.setText("        "+ s + " Seconds to go...");
                     }
                     catch(Exception e1)
                     {
                         System.out.println(e);
                     }
                }
                JOptionPane.showMessageDialog(fr,"Times up!!!");
                tf.setText("");
                tf.setEnabled(false);
            }

        });          
    }


    public static void main(String args[])
    {
        CountdownTimer obj = new CountdownTimer();
        obj.start();
    }

}

当我点击我创建的提交按钮时,我遇到了一个异常

Exception in thread "Thread-4" java.lang.NumberFormatException: For input string: ""
    at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.base/java.lang.Integer.parseInt(Integer.java:662)
    at java.base/java.lang.Integer.parseInt(Integer.java:770)
    at CountdownTimer.buildGUI(CountdownTimer.java:40)
    at CountdownTimer.run(CountdownTimer.java:15)
Exception in thread "Thread-0" java.lang.NumberFormatException: For input string: ""
    at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.base/java.lang.Integer.parseInt(Integer.java:662)
    at java.base/java.lang.Integer.parseInt(Integer.java:770

【问题讨论】:

    标签: java multithreading user-interface


    【解决方案1】:

    问题出在第 40 行 t = Integer.parseInt(n);

    好像n的值不能被解析为整数值。

    1- 您可以考虑使用this answer 验证文本是否为有效整数:

    public static boolean isInteger(String s) {
        return isInteger(s,10);
    }
    
    public static boolean isInteger(String s, int radix) {
        if(s.isEmpty()) return false;
        for(int i = 0; i < s.length(); i++) {
            if(i == 0 && s.charAt(i) == '-') {
                if(s.length() == 1) return false;
                else continue;
            }
            if(Character.digit(s.charAt(i),radix) < 0) return false;
        }
        return true;
    }
    

    2- 或者您可以先尝试解析文本以了解该值是否无效以使用this answer 解析为整数

    public Integer tryParse(String text) {
      try {
        return Integer.parseInt(text);
      } catch (NumberFormatException e) {
        return null;
      }
    }
    

    【讨论】:

      【解决方案2】:

      修复了以下 2 个问题。

      1. buildGUI 方法中 t = Integer.parseInt(n) 语句有问题。因为在那一刻 tf2 测试字段没有价值。然后tf2.getText() 返回null。然后t = Integer.parseInt(n);语句抛出空点异常。
      2. 错误实现的线程。对于倒计时,您需要实现单独的线程

      以下代码正常工作。

      import java.awt.event.*;
      import java.awt.*;
      import javax.swing.*;
      import java.lang.*;
      
      public class CountdownTimer {
          JTextField tf,tf2;
          JLabel l1,l2;
          JFrame fr;
          JButton b;
          String n;
          int t;
          public void run()
          {
              buildGUI();
          }
          public void buildGUI()
          {
              fr = new JFrame("Countdown Timer");
              JPanel p = new JPanel();
              l2 = new JLabel("Please Enter the Time:");
              l1 = new JLabel("");
              tf2 = new JTextField(8);
              tf = new JTextField(15);
              tf.setVisible(false);
              tf2.setEnabled(true);
              tf2.setBackground(Color.white);
              p.setBackground(Color.white);
              JButton b=new JButton("Submit");
              b.setEnabled(true);
              b.setVisible(true);
              fr.add(p);
              p.add(l2);
              p.add(tf2);
              p.add(b);
              p.add(l1);
              p.add(tf);
              fr.setVisible(true);
              fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              fr.setSize(300,200);
              fr.setResizable(false);
              fr.setSize(300,200);
              b.addActionListener(new ActionListener()
              {
                  public void actionPerformed(ActionEvent e)
                  {
                      tf.setEnabled(false);
                      b.setVisible(false);
                      tf2.setVisible(false);
                      l2.setVisible(false);
                      tf.setVisible(true);
                      Font f = new Font("Verdana", 0, 18);
                      tf.setFont(f);
                      tf.setBackground(Color.white);
                      tf.setVisible(true);
                      n = tf2.getText();
                      t = Integer.parseInt(n);
                      Thread countThread = new Thread(new Runnable() {
                          @Override
                          public void run() {
                              for(int i = t;i >= 0; i--)
                              {
                                  try
                                  {
                                      String s = Integer.toString(i);
                                      tf.setText("        "+ s + " Seconds to go...");
                                      Thread.sleep(1000);
                                  }
                                  catch(Exception e1)
                                  {
                                      System.out.println(e);
                                  }
                              }
                              JOptionPane.showMessageDialog(fr,"Times up!!!");
                          }
                      });
                      countThread.start();
                  }
              });
          }
      
          public static void main(String args[])
          {
              CountdownTimer obj = new CountdownTimer();
              obj.buildGUI();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2011-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-17
        • 2013-12-09
        • 1970-01-01
        • 1970-01-01
        • 2020-01-31
        相关资源
        最近更新 更多