Есть ошибки, но я не вижу, где

#java #eclipse #user-interface

#java #eclipse #пользовательский интерфейс

Вопрос:

По какой-то причине я получаю ошибки в приведенном ниже коде, и я не понимаю, почему, можете ли вы их обнаружить?

 public void delTask_mouseClicked(MouseEvent e)
{
    if(delTask.isEnabled() == false) {
        int numTasks = taskTable.getRowCount();
        Object[] currentTasks;
        currentTasks = new Object[numTasks];
        for (int i = 0; i < numTasks ; i  ){
            Object tasks = taskTable.getModel().getValueAt(i, 1);
            currentTasks[i] = tasks;
        }
        System.out.println(currentTasks);
     }
}
 

Спасибо за помощь, это действительно ценится.

Ниже приведен огромный блок ошибок, которые я получаю:

 Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at projecttaskmanagement.ProjectGUI.delTask_mouseClicked(ProjectGUI.java:233)
at projecttaskmanagement.ProjectGUI$2.mouseClicked(ProjectGUI.java:109)
at java.awt.AWTEventMulticaster.mouseClicked(AWTEventMulticaster.java:212)
at java.awt.Component.processMouseEvent(Component.java:5520)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3135)
at java.awt.Component.processEvent(Component.java:5282)
at java.awt.Container.processEvent(Container.java:1966)
at java.awt.Component.dispatchEventImpl(Component.java:3984)
at java.awt.Container.dispatchEventImpl(Container.java:2024)
at java.awt.Component.dispatchEvent(Component.java:3819)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4212)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3901)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3822)
at java.awt.Container.dispatchEventImpl(Container.java:2010)
at java.awt.Window.dispatchEventImpl(Window.java:1791)
at java.awt.Component.dispatchEvent(Component.java:3819)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
 

КОД В СТРОКЕ 233:
int numTasks = taskTable.getRowCount();

ТАБЛИЦА ЗАДАЧ ОПРЕДЕЛЕНА НИЖЕ:

     String[] taskcolumnNames = {"ID #",
            "Name",
            "Description",
            "Start Date",
            "End Date",
            "Staff",
            "Completed"};
    Object[][] taskdata = {
            {new Integer(1), "Requirements Analysis",
             "Analysing the requirements",
             "01/09/2011", "15/10/2011",
             "Bob", new Boolean(true)},
            {new Integer(2), "System Design",
             "Designing the System",
             "15/09/2011", "15/10/2011",
             "Alice", new Boolean(true)},
            {new Integer(3), "Code (A)",
             "Part 'A' of coding",
             "01/10/2011", "15/11/2011",
             "David", new Boolean(true)},
        };
    JTable taskTable = new JTable(taskdata, taskcolumnNames);
 

Комментарии:

1. @ron8: где создается таблица задач? Это ключевая часть недостающей информации (см. Обновления к Моему ответу, почему).

Ответ №1:

Пока мы ждем, когда вы опубликуете фактические ошибки, которые вы получаете (a), пожалуйста, найдите минутку, чтобы НИКОГДА этого не делать:

 if (delTask.isEnabled() == false)
 

Гораздо лучшая форма — более простая для чтения:

 if (! delTask.isEnabled())
 

Теперь мы возвращаем вас к запланированному программированию в ожидании вашего обновления.


 Dum de dum de dum ...
 

Теперь, основываясь на вашем обновлении, следующая часть stackdump:

 Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at projecttaskmanagement.ProjectGUI.delTask_mouseClicked(ProjectGUI.java:233)
 

указывает, в чем заключается проблема. Выясните, какая из ваших строк находится в строке номер 233, и вот она у вас есть. То, что вы пытаетесь использовать в этой строке, на самом деле является нулевой ссылкой.

Судя по фрагменту, это, вероятно, будет одна из следующих строк:

 public void delTask_mouseClicked(MouseEvent e)
{
    if(delTask.isEnabled() == false) {                            // <--
        int numTasks = taskTable.getRowCount();                   // <--
        Object[] currentTasks;
        currentTasks = new Object[numTasks];
        for (int i = 0; i < numTasks ; i  ){
            Object tasks = taskTable.getModel().getValueAt(i, 1); // <--
            currentTasks[i] = tasks;
        }
        System.out.println(currentTasks);
     }
}
 

Первое будет, потому delTask что само по себе равно нулю, второе, если taskTable равно нулю.

Третий будет, если taskTable сам по себе является допустимым, но значение, возвращаемое его getModel() методом, равно null.


Итак, похоже, что ваше taskTable значение равно нулю. Что касается того, почему это так, это непознаваемо на основе текущей информации. Что вам нужно будет сделать, так это проверить все места, для которых установлено допустимое значение, и убедиться, что это произойдет до того, как вы (или, что более вероятно, AWT под контролем вашего пользователя) вызовете этот метод.

И, конечно, убедитесь, что в какой-то момент после создания не установлено значение NULL.

Если вы не можете этого гарантировать, вам, вероятно, потребуется изменить:

 if (delTask.isEnabled() == false)
 

во что-то вроде:

 if ((! delTask.isEnabled()) amp;amp; (taskTable != NULL))
 

но я предпочел бы устранить основную причину проблемы, а не применять этот пластырь.

Ваш код, который создает JTable , кажется нормальным (синтаксически), но есть небольшая загадка, где это делается. Создан ли он таким образом, чтобы его можно было использовать с того места, где вы пытаетесь его использовать.

Например, если код, который его создает, находится внутри конструктора, этот конкретный taskTable код будет локальным для указанного конструктора (и будет уничтожен при выходе), и его нельзя будет использовать из других источников. В этом случае его необходимо сделать переменной уровня объекта, чтобы другие методы могли получить к нему доступ.

Вы можете увидеть этот эффект в следующей программе:

 public class testprog {
    public Object thingOne;
    public Object thingTwo;

    public void someFunction() {
        thingOne = new Object();
        Object thingTwo = new Object();
    }

    public void debug() {
        if (thingOne == null)
            System.out.println ("thingOne is NULL");
        else
            System.out.println ("thingOne is valid");
        if (thingTwo == null)
            System.out.println ("thingTwo is NULL");
        else
            System.out.println ("thingTwo is valid");
    }

    public static void main(String args[]) {
        testprog tp = new testprog();
        tp.someFunction();
        tp.debug();
    }
}
 

Это выводит:

 thingOne is valid
thingTwo is NULL
 

поскольку thingTwo настроенная в someFunction() является локальной версией и никоим образом не настраивает объектный уровень thingTwo — уровень объекта остается неизменным, null и, если вы попытаетесь разыменовать его, вы увидите ту же проблему, что и у вас.


(a) Лучшие отчеты о проблемах содержат небольшой полный фрагмент кода, отображающий проблему, ожидаемое поведение и фактическое поведение.

Если мы разместим этот ваш образец в голой Java-программе Eclipse, он будет очень неполным. MouseEvent , delTask и taskTable не имеет определений, а без этой информации его будет немного сложно отлаживать.

Кроме того, Eclipse (для синтаксических ошибок) и сама Java (для ошибок во время выполнения) прекрасно могут очень подробно рассказать вам, в чем заключаются ваши проблемы, и вы должны прочитать, что он вам говорит. Вы также должны сообщить нам эту информацию, если вам нужна помощь 🙂

Комментарии:

1. КОД В СТРОКЕ 233: int numTasks = taskTable.getRowCount();

Ответ №2:

В какой строке находится строка 233 ProjectGUI.java ? По крайней мере, одно из следующих значений равно null:

  • delTask
  • taskTable
  • taskTable.getModel()

Выясните, какая из них попадает в строку 233 (согласно вашему отчету об ошибках), и вы выяснили, в чем проблема. Нам нужно будет просмотреть больше кода, чтобы определить, почему переменная не имеет ожидаемого значения.

Комментарии:

1. Строка 233: int numTasks = taskTable.getRowCount();

2. Это указывает, что taskTable это значение равно нулю. Он пытается вызвать getRowCount() функцию для объекта, который не существует. Где и как taskTable определяется?

3. Просто добавил его к исходному вопросу. Спасибо за помощь: D

4. Где этот фрагмент кода? Являются ли они экземплярами класса ProjectGUI?