0

我是 Net Beans 的新手。当我尝试运行它时,我收到一个错误,例如无法从静态上下文引用非静态变量。请帮我解决。但是当我在 main 中声明 Label 时,我可以得到输出(在 eclipse 中)。net beans 不允许更改变量声明。

import java.net.InetAddress;

public class Test extends javax.swing.JFrame {

    public Test() {
        initComponents();
    } // 

    private void initComponents() {
        l1 = new javax.swing.JLabel();
        name = new javax.swing.JLabel();
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        l1.setText("System Name:");
        name.setText("jLabel2");
        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                .addComponent(l1, javax.swing.GroupLayout.PREFERRED_SIZE, 172, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(name, javax.swing.GroupLayout.PREFERRED_SIZE, 201, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(0, 21, Short.MAX_VALUE))
                );
        layout.setVerticalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(109, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                .addComponent(l1, javax.swing.GroupLayout.PREFERRED_SIZE, 89, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addComponent(name, javax.swing.GroupLayout.PREFERRED_SIZE, 89, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(102, 102, 102))
                );
        pack();
    }// 

    public static void main(String args[]) {
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(test.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(test.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(test.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(test.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
// 
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Test().setVisible(true);
            }
        });
        try {
            ip = InetAddress.getLocalHost();
            name.setText(ip.getHostName());
        } catch (Exception e) {
        }
    }
    InetAddress ip;
// Variables declaration - do not modify 
    private javax.swing.JLabel l1;
    private javax.swing.JLabel name;
// End of variables declaration 
}
4

2 回答 2

1

这基本上告诉您正在尝试从“静态上下文”中引用一些非静态变量。

看你的main方法。它被声明为static,它不依赖于要调用的类的给定实例。

public static void main(String args[]) {
    /*...*/
    try {
        ip = InetAddress.getLocalHost();
        name.setText(ip.getHostName());
    } catch (Exception e) {
    }
}

InetAddress ip;
// Variables declaration - do not modify 
private javax.swing.JLabel l1;
private javax.swing.JLabel name;

但是您尝试访问的变量不是 ( static),它们依赖于声明它们的类的特定实例(AKA 实例变量)。

就目前而言,您唯一的选择是将有问题的代码段移动到类的构造函数或您可以调用的其他一些非静态方法中......

public Test() {
    initComponents();
    try {
        ip = InetAddress.getLocalHost();
        name.setText(ip.getHostName());
    } catch (Exception e) {
    }
} // 

花时间阅读理解实例和类成员

您可能还想通读Java 编程语言的代码约定

于 2013-09-04T07:30:24.913 回答
0

此错误与 netbeans 无关。相反,当您从静态方法中引用非静态变量时,您会得到这个。

因此,对于简短的修复,您可以将变量设为静态。对于长期修复,不要从 main 方法中引用它们,而是使用您在 main 中的代码创建单独的方法,并从 main 中调用该方法,例如 new ClassName().methodName(); 在这种情况下,不需要将变量声明为静态的。

于 2013-09-04T07:32:02.763 回答