2010-07-12 2 views
1

Назначение кода: Создайте две кнопки (button1 и button2). Когда Пользователь нажимает кнопку1, измените текст кнопки2. Когда Пользователь нажимает кнопку2, измените текст кнопки1.NullPointerException при запуске нескольких событий события

Вот код, я использую:

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

public class multiAL { 
JButton button1; 
JButton button2; 
JFrame frame; 
public static void main(String[] args) { 
    multiAL setterAL = new multiAL(); 
    setterAL.go(); 
} 

public void go() { 
    button1 = new JButton("Click me, I'm One"); 
    button2 = new JButton("Click me, I'm Two"); 
    frame.setSize(500,500); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.getContentPane().add(BorderLayout.WEST, button1); 
    frame.getContentPane().add(BorderLayout.EAST, button2); 
    frame.setVisible(true); 
    button1.addActionListener(new b1L()); 
    button2.addActionListener(new b2L()); 
} 

class b1L implements ActionListener { 
    public void actionPerformed(ActionEvent event) { 
     button2.setText("What??, you clicked 1??"); 
    } 
} 

class b2L implements ActionListener { 
    public void actionPerformed(ActionEvent event) { 
     button1.setText("What??, you clicked 2??"); 
    } 
    } 
} 

Он компилирует прекрасно, но когда я запускаю его я получаю следующее сообщение об ошибке: Exception in thread "main" java.lang.NullPointerException at multiAL.go(multiAL.java:17) at multiAL.main(multiAL.java:11)

До сих пор, я столкнулся только во время компиляции ошибки. Поэтому есть два вопроса, которые я хочу задать:

1) Что не так с кодом? 2) Как отслеживать ошибки времени выполнения?

+0

Число после имени файла дает фактическую линию, где ошибка произошло, кстати. – Gnoupi

+1

См. «Правила для именования» - http://java.sun.com/docs/codeconv/html/CodeConventions.doc8.html «Имена классов должны быть существительными в смешанном случае с первой буквой каждого внутреннего слова, заглавного. Постарайтесь, чтобы ваши имена классов были простыми и описательными. Используйте целые слова - избегайте сокращений и сокращений. –

+1

Я буду помнить это в следующий раз. – MoonStruckHorrors

ответ

2

frame не инициализируется, поэтому он решает null и вы не можете вызывать методы на null объектов. Как и вы инициализировали button1 и button2, вы также должны инициализировать frame.

frame = new JFrame(); 
2

Но где

frame = new JFrame(); 

строка кода? Поскольку кадр является пустым, ничего не может случиться, я думаю ...

3

Я считаю, что ваш объект кадра равен нулю. Он никогда не инициализируется. Вы можете прочитать исключение во время выполнения. Это говорит multiAL.java:17

Это означает, что в строке 17 вы получите ваш NullPointerException

+0

Эти ошибки заставили меня убить когда-нибудь. Но все же остается один вопрос. Откуда я начинаю считать строки? – MoonStruckHorrors

+1

в верхней части файла –

+1

@MoonStruckHorrors, попробуйте использовать IDE, например, eclipse. eclipse показывает номера строк. Кроме того, части stacktrace превращаются в гиперссылки, поэтому вы можете щелкнуть исключение и перейти к строке, вызвавшей его. Если вы застряли в командной строке * nix, используйте VIM и используйте команду перехода к строке. 'Перейти к номеру строки n.Например, чтобы перейти к строке 42, вы должны ввести: 42' –

0

Рассмотрит переименование класса следовать соглашениям имени класса Java: CamelCase (http://en.wikipedia.org/wiki/CamelCase)

И проблемы, как указывался другими пользователями , это объект кадра, который не инициализируется.

Добавьте следующую строку перед первым использованием объекта кадра:

frame = new JFrame(); 
frame.setSize(500,500); 
+0

Это не имеет никакого отношения к вопросу. В следующий раз используйте комментарии. Пока вы не сможете избежать ответов в комментариях, или ваш путь к 50 rep будет очень длинным ;-) –

+0

Спасибо, я новичок здесь. Я сделаю это в следующий раз. – Zheileman

1

Initialize кадра перед первым использованием:

frame = new JFrame();