2015-08-14 3 views
-3

Я создал класс клавиатуры для работы с роботом. Но когда я начинаю использовать методы из этого класса, у меня ошибка в журналах.Класс класса Робот класса

Вот мой Keyboard.java методом pressEscape():

public class Keyboard { 

    private static Robot robot; 
    private static int time = 1000; 

    public Keyboard(){ 
     try { 
      robot = new Robot(); 
     } catch (AWTException e) { 
      e.printStackTrace(); 
     } 
    } 

    public void pressEscape() throws TestException { 
     if (!getSession().CanRun()) 
      throw new TestException(InvalidStateMessage); 
     robot.delay(time); 
     robot.keyPress(KeyEvent.VK_ESCAPE); 
     robot.delay(time); 
     robot.keyRelease(KeyEvent.VK_ESCAPE); 
     robot.delay(time); 
    } 

} 

А вот ошибка из журнала:

[2015/08/13 15:43:29] [ID: 7F4315A] [Селен] : java.lang.NullPointerException
[2015/08/13 15:43:29] [ID: 7F4315A] [Селен]: в Kodak.AutoTest.Framework.Keyboard.pressEscape (Keyboard.java:128)

Изменение немного метод:

public void pressEscape() throws TestException { 
     if (!getSession().CanRun()) 
      throw new TestException(InvalidStateMessage); 
     try { 
      new Robot(); 
      robot.setAutoDelay(time); 
      robot.keyPress(KeyEvent.VK_ESCAPE);  
      robot.setAutoDelay(time); 
      robot.keyRelease(KeyEvent.VK_ESCAPE); 
     } catch (AWTException e) { 
      e.printStackTrace(); 
     } 

    } 

, но по-прежнему имеет ту же самую ошибку на линии:

robot.keyPress(KeyEvent.VK_ESCAPE); 
+0

что линия 128 в коде? Где вы получаете функцию 'getSession()'? – Jakuje

+1

Вы не должны поддерживать ссылку 'static' для полей для класса, если вы не собираетесь сделать ее классом утилиты и также сделать методы' static' – MadProgrammer

+0

. Вы также можете использовать ['Robot # setAutoDelay'] (http : //docs.oracle.com/javase/7/docs/api/java/awt/Robot.html#setAutoDelay (int)), который 'Robot' будет использовать между командами выполнения – MadProgrammer

ответ

0

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

if (!getSession().CanRun()) 

, который бросит NPE, если getSession() возвращается null. На самом деле другой вариант - если вы не смогли инициализировать robot, но тогда вы увидите AWTException в журналах.

Но вы должны подтвердить это, посмотрев номер строки, которую дали вам журналы. Если это так, я предлагаю изменение

if (!getSession().CanRun()) 
      throw new TestException(InvalidStateMessage); 

в

Session session = getSession(); 
if ((session==null) || !session.CanRun()) 
      throw new TestException(InvalidStateMessage); 

Это будет затвердевать эту часть, и означает, что вы получите TestException, если сеанс является недействительным. (Я угадываю тип, который возвращает getSession().)

Кроме того, хотя вы инициализируете robot в своем конструкторе, вы должны знать, что это статическое поле. Это означает, что если у вас много экземпляров Keyboard, каждый раз, когда вы создаете экземпляр, он перезаписывает предыдущий экземпляр robot новым, потому что все они имеют один и тот же.

Вы должны либо изменить его на поле экземпляра (удалить модификатор static), либо инициализировать его только один раз (проверьте, имеет ли он значение null, и инициализирует его, только если это так).

+0

У меня есть другие классы Java, и все они отлично работают с этим. И сеанс не равен нулю. –

0

Для этого ваша переменная robot должна иметь значение null в строке 128. Это может произойти только в new Robot(). Проверьте свои журналы, чтобы убедиться, что это так. А также см. Комментарии к своим вопросам от MadProgrammer и действовать на них.

+0

пытался это сделать: public void pressEscape() throws TestException { \t if (! GetSession(). CanRun()) throw new TestException (InvalidStateMessage); \t try { \t \t \t новый Robot(); \t \t \t robot.setAutoDelay (время); \t \t robot.keyPress (KeyEvent.VK_ESCAPE); \t \t \t robot.setAutoDelay (время); \t \t robot.keyRelease (KeyEvent.VK_ESCAPE); \t \t} catch (AWTException e) { \t \t \t e.printStackTrace(); \t \t} \t } и имеет ту же самую ошибку на линии: robot.keyPress (KeyEvent.VK_ESCAPE); –

+0

Вы должны добавить код в исходный вопрос. По крайней мере, в вставленном коде я не вижу, что 'new Robot()' присваивается 'robot'. – KDM

+0

отредактировал главный вопрос –

0

Он сейчас работает, вот полный код:

public class Keyboard { 

    private static Robot robot; 

    public void pressEscape() throws TestException { 
    if (!getSession().CanRun()) 
     throw new TestException(InvalidStateMessage); 
    try { 
     robot = new Robot(); 
     robot.setAutoDelay(time); 
     robot.keyPress(KeyEvent.VK_ESCAPE);  
     robot.setAutoDelay(time); 
     robot.keyRelease(KeyEvent.VK_ESCAPE); 
    } catch (AWTException e) { 
     e.printStackTrace(); 
    } 

} 

} 
Смежные вопросы