有错误但我看不到哪里

时间:2011-11-02 04:33:16

标签: java eclipse user-interface

出于某种原因,我在下面的代码中收到错误,我看不清楚原因,你能发现任何错误吗?

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);

2 个答案:

答案 0 :(得分:3)

虽然我们正在等待您发布(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()方法返回的值为空。


因此,您的taskTable似乎为空。至于为什么这是如此,根据当前信息,这是不可知的。您需要做的是检查它设置为有效值的所有位置,并确保在之前发生(或者更有可能是在用户控制下的AWT)调用此方法。

当然,确保在创建后的某个时刻没有将其设置回NULL。

如果您无法保证,您可能需要更改:

if (delTask.isEnabled() == false)

成像:

if ((! delTask.isEnabled()) && (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) 最佳问题报告附带一个小而完整的代码段,展示了问题,预期行为和实际行为。

如果我们将您的样本发布到裸体Eclipse Java程序中,那么它就非常不完整。 MouseEventdelTasktaskTable没有定义,如果没有这些信息,则有点难以调试。

此外,Eclipse(用于语法错误)和Java本身(用于运行时错误)完全能够非常详细地告诉您您的问题是什么,并且您应该阅读它告诉您的内容。如果您需要帮助,您还应该将这些信息告知我们: - )

答案 1 :(得分:0)

哪一行是ProjectGUI.java的第233行?至少下列之一为null:

  • delTask
  • taskTable
  • taskTable.getModel()

找出其中哪些属于第233行(根据您的错误报告),并且您已经找到了问题所在。我们需要查看更多代码来确定变量没有预期值的原因。