Программа выдаёт исключение ошибки потока - PullRequest
0 голосов
/ 25 марта 2020

когда я нажимаю кнопку подтверждения, ничего не происходит, я создал программу для создания счетчика, в который мы можем добавить время, а когда я ввожу время в секундах и нажимаю кнопку отправки, он не работает

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

Ответы [ 2 ]

1 голос
/ 25 марта 2020

Проблема со строкой 40 t = Integer.parseInt(n);

Кажется, что значение n недопустимо для анализа в качестве целочисленного значения.

1 - вы можете рассмотреть возможность проверки текста: допустимое целое число, используя этот ответ :

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 ответ

public Integer tryParse(String text) {
  try {
    return Integer.parseInt(text);
  } catch (NumberFormatException e) {
    return null;
  }
}
0 голосов
/ 25 марта 2020

Исправлено ниже 2 проблем.

  1. В build GUI метод t = Integer.parseInt(n) оператор имеет проблему. Потому что при этом значение tf2 Test Field не имеет значения. Тогда 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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...