#java #swing #nullpointerexception
#java — язык #swing #исключение nullpointerexception #java
Вопрос:
Я пытаюсь создать простой графический интерфейс Java (я изучал всего неделю). Я создал текстовое поле, в которое пользователь должен ввести число. Я хочу что-то сделать с числом, но проблема прямо сейчас в том, что я получаю ‘null Указатель excepton’, когда я вызываю метод textfield.getText(). В документации говорится, что вы можете получить исключение, когда ваш базовый документ равен null. Я не знаю, что такое «неизменяемый документ».
Любая помощь? Код:
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.BadLocationException;
import java.awt.*;
import java.awt.event.*;
public class GUI extends JFrame {
String [] aFull1 = new String [500];
String [] aFull2 = new String [500];
String [] aFull3 = new String [500];
String [] aFull4 = new String [500];
String [] aList1 = new String [15];
String [] aList2 = new String [15];
String [] aList3 = new String [15];
String [] aList4 = new String [15];
int pop1 = 0;
int pop2 = 0;
int pop3 = 0;
int pop4 = 0;
//JTextField tfNr = new JTextField ();
JTextField tfNr = new JTextField ("");
JButton bStart = new JButton ("Start");
JButton bPause = new JButton ("Pause");
JButton bStop = new JButton ("Stop");
JList lList1 = new JList (aList1);
JList lList2 = new JList (aList2);
JList lList3 = new JList (aList3);
JList lList4 = new JList (aList4);
JButton bOK = new JButton ("OK");
JButton bRemove = new JButton ("Remove last item");
JTextArea taTijd = new JTextArea ("00:00:00", 10, 4);
JPanel panel = new JPanel();
Timer timer = new Timer(1000, new ActionListener () {
public void actionPerformed (ActionEvent e){
time ;
dispTime (); }}
);
final JTextArea taStrtNr = new JTextArea ("Voer startnummer in:");
static int time = 0;
static int pTime;
GUI () {
// Set title //
super ("Ultraloop");
addToWindow ();
setPos ();
setProperties ();
// Add ActionListeners //
handler HO = new handler ();
bStart.addActionListener(HO);
bPause.addActionListener(HO);
bStop.addActionListener(HO);
bOK.addActionListener(HO);
/*for (int i = 0; i<100; i ){
addOne(1,"One");
}
addOne(1,"Two");
scrollDown(1);
addOne(1,"One");
addOne(2,"Two");
addOne(3,"Three");
addOne(4,"Four");*/
// Final add //
add(panel);
}
private class handler implements ActionListener {
public void actionPerformed (ActionEvent e){
if (e.getSource()==bStart){
if (!timer.isRunning()){
timer.start();
}
}
else if (e.getSource () == bPause){
if (timer.isRunning()){
pTime = time;
timer.stop();
}
else if (pTime != 0){
timer.start();
time = pTime;
}
}
else if (e.getSource() == bStop){
if (timer.isRunning()){
timer.stop();
time = 0;
dispTime();
}
}
else if (e.getSource() == bOK){
try {
if (tfNr.getDocument().getText(0,2) != null){
addOne(Integer.getInteger(tfNr.getDocument().getText(0,2)));
}
} catch (BadLocationException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
}
private void addToWindow (){
add(tfNr);
add(bStart);
add(bPause);
add(bStop);
add(lList1);
add(lList2);
add(lList3);
add(lList4);
add(bOK);
add(bRemove);
add(taTijd);
add(taStrtNr);
}
private void setPos () {
tfNr.setBounds(20,25, 75,25);
bStart.setBounds(500,255, 75,25);
bPause.setBounds(500,290, 75,25);
bStop.setBounds(500,325, 75,25);
lList1.setBounds(20,75, 60,272);
lList2.setBounds(80,75, 50,272);
lList3.setBounds(130,75, 150,272);
lList4.setBounds(280,75, 150,272);
bOK.setBounds(110, 25, 75, 25);
bRemove.setBounds(80,20, 150,20);
taTijd.setBounds(445,10, 150,50);
taStrtNr.setBounds(20, 5, 150, 25);
}
private void setProperties () {
// Set Editable //
taTijd.setEditable(false);
taStrtNr.setEditable(false);
// Set Font //
taTijd.setFont(new Font("Arial", Font.BOLD Font.ITALIC, 28));
bRemove.setFont (new Font("Arial", Font.PLAIN, 12));
// Set List properties //
lList1.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
lList2.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
lList3.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
lList4.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
lList1.setVisibleRowCount(15);
lList2.setVisibleRowCount(15);
lList3.setVisibleRowCount(15);
lList4.setVisibleRowCount(15);
lList1.setBorder(BorderFactory.createLineBorder(Color.black));
lList2.setBorder(BorderFactory.createLineBorder(Color.black));
lList3.setBorder(BorderFactory.createLineBorder(Color.black));
lList4.setBorder(BorderFactory.createLineBorder(Color.black));
lList1.setBackground(new Color(180,180,180));
lList2.setBackground(new Color(180,180,180));
lList3.setBackground(new Color(180,180,180));
lList4.setBackground(new Color(180,180,180));
panel.setBackground(Color.WHITE);
tfNr.setBackground(new Color(230,230,230));
tfNr.setBorder(BorderFactory.createLineBorder(Color.BLACK));
}
private void addOne (int nr) {
System.out.print(String.format("%d",nr));
}
private void removeOne (){
}
private void dispTime () {
int h, m, s;
h = time/3600;
m = (time%3600)/60;
s = ((time%3600)%60);
taTijd.setText(String.format("d:d:d",h,m,s));
}
private void scrollDown (int a) {
}
}
Комментарии:
1. Опубликуйте полную трассировку стека исключения. Сообщите нам полное имя класса
Textfield
(подсказка:tfNr.getClass().getCanonicalName()
). И скажите нам, с какой строки начинается ваш фрагмент кода.2. Чтобы получить более качественную помощь раньше, опубликуйте SSCCE .
3. Кстати — в J2SE нет «Текстового поля». Вы имели в виду 1)
TextField
2)JTextField
(как подразумевается вswing
теге) 3) стороннего пользователяTextfield
?4. Это JTextField. (Sry я этого не публиковал : D).
5. Моя ошибка: Исключение в потоке «AWT-EventQueue-0» java.lang. Исключение NullPointerException
Ответ №1:
Если вы получаете нулевой указатель на эту строку:
if (tfNr.getText() != null){
Тогда казалось бы, что tfNr
равно нулю. Убедитесь, что вы присваиваете этой переменной значение перед этой строкой.
Ответ №2:
tfNr.getText() использует Document (PlainDocument для JTextField). Итак, это то же самое, что вызывать tfNr.getDocument().getText(0, tfNr.getDocument().getLenght())
Комментарии:
1. Привет. Я понял эту часть. Но что мне нужно сделать, чтобы удалить мое исключение NullPointerException? Я не понимаю эту часть: D
Ответ №3:
В этой строке генерируется исключение:
addOne(Integer.getInteger(tfNr.getDocument().getText(0,2)));
и это потому, что следующая часть этой строки оценивается как null:
Integer.getInteger(tfNr.getDocument().getText(0,2))
. Следующий метод не принимает null в качестве аргумента:
private void addOne (int nr) {
поскольку примитивные типы несовместимы с нулевыми указателями.
Следовательно, генерируется исключение NullPointerException.
Чтобы избавиться от исключения (но не от проблемы), вы могли бы изменить int на Integer в строке выше.
Что касается проблемы, вам следует взглянуть на то, что на самом деле делает метод getInteger() (ознакомьтесь с javadoc). Я предполагаю, что то, что вы действительно хотите сделать, это:
addOne(Integer.parseInt(tfNr.getText(0,2)));
или, может быть:
addOne(Integer.parseInt(tfNr.getText()));
чтобы получить весь текст.
Также обратите внимание, что вам не нужен getDocument() .
PS Возможно, вы захотите перефразировать свой вопрос?