为什么我会收到“非静态变量和静态上下文”错误?

时间:2013-08-17 14:37:33

标签: java static

此代码:

package agendaweb;

 import javax.swing.*;
 import java.awt.*;
 import java.awt.event.*;
 import java.io.*;
 import java.sql.*;
 import java.util.*;

public class AgendaWeb {


public class Agenda extends JFrame implements ActionListener{

   //Swing
   private JMenuBar barra;
   private JMenu menu1;
   private JMenuItem mi1, mi2, mi3;
   private JTextField camponuevonombre, camponuevotelefono, campobuscarnombre;
   private JLabel etiquetanuevonombre, etiquetanuevotelefono, imprimenombre, imprimetelefono, nombreprograma, nombreautor, numeroversion, dibusca;
   private JButton boton, botonnuevo, botonbusca;
   //Archivo
   //File archivo = new ("C://pruebas//exportacion.txt");
   Formatter nuevoarchivo;
   Scanner x;

   //Metodo constructor
   public Agenda(){
       setLayout(null);

       nombreprograma = new JLabel ("Agenda Telefónica");
       nombreprograma.setBounds(150,30,180,30);
       add(nombreprograma);

       nombreautor = new JLabel ("Fulanito Mengano Exposito");
       nombreautor.setBounds(150,60,180,30);
       add(nombreautor);

       numeroversion = new JLabel ("Version 0.1");
       numeroversion.setBounds(150,90,180,30);
       add(numeroversion);
   //Menu

       barra = new JMenuBar();
       setJMenuBar(barra);
       menu1 = new JMenu("Archivo");
       barra.add(menu1);
       mi1 = new JMenuItem("Nuevo");
       mi1.addActionListener(this);
       menu1.add(mi1);
       mi2 = new JMenuItem("Nuevo");
       mi2.addActionListener(this);
       menu1.add(mi2);
       mi3 = new JMenuItem("Nuevo");
       mi3.addActionListener(this);
       menu1.add(mi3);


   }

   public void actionPerformed(ActionEvent e){
       Container f=this.getContentPane();
       if(e.getSource()==mi1){
           nombreprograma.setVisible(false);
           nombreautor.setVisible(false);
           numeroversion.setVisible(false);

           //Formulario

           etiquetanuevonombre = new JLabel("Nuevo Nombre");
           etiquetanuevonombre.setBounds(0,0,180,30);
           add(etiquetanuevonombre);
           etiquetanuevonombre.setVisible(true);

           camponuevonombre = new JLabel("Nuevo Nombre");
           camponuevonombre.setBounds(200,0,180,30);
           add(camponuevonombre);
           camponuevonombre.setVisible(true);

           etiquetanuevotelefono = new JLabel("Nuevo Nombre");
           etiquetanuevotelefono.setBounds(0,0,180,30);
           add(etiquetanuevotelefono);
           etiquetanuevotelefono.setVisible(true);

           camponuevotelefono = new JLabel("Nuevo Nombre");
           camponuevotelefono.setBounds(200,50,180,30);
           add(camponuevotelefono);
           camponuevotelefono.setVisible(true);

           botonnuevo = new JButton("Crear");
           botonnuevo.setBounds(200,100,180,30);
           add(botonnuevo);
           botonnuevo.addActionListener(this);
           botonnuevo.setVisible(true);

       } 
       if(e.getSource()==mi2){


       } 
       if(e.getSource()==mi3){
          System.exit(0);

       } 

       if(e.getSource()==botonnuevo){
          try{
              Class.forName("com.mysql.jdbc.Driver");
              Connection con = DriveManager.getConnection("");
              Statement
              estado.executeUpdate("INSERT INTO agenda VALUES ()");
          } catch(SQLException ex){
              System.out.println("Error de MyQSL");

          }

       } 

   }
  }

public static void main(String[] args) {

    Agenda ventana = new Agenda();
    ventana.setBounds(10,20,450,250);
    ventana.setVisible(true);
}

}

显示此错误:

线程“main”中的异常java.lang.RuntimeException:无法编译的源代码 - 无法通过agendaweb.AgendaWeb.main(AgendaWeb.java:125)上的静态上下文引用非静态变量

为什么会发生这种情况以及如何解决?

3 个答案:

答案 0 :(得分:1)

问题是您的Agenda类未声明为静态,而main方法是静态方法。尽量让你的Agenda类保持静态。

答案 1 :(得分:0)

出错的原因是AgendaAgendaWeb类的属性。在您的main方法中,这是一种static方法,您尝试访问Agenda而不创建AgendaWeb的实例。在没有实例的情况下只能访问static个变量,因此会抛出错误。

我不确定你为什么需要AgendaWeb课程,这对我来说看起来不是一个很好的设计。如果不需要,请简单地将其取下。但是如果你真的需要它,那么你需要将你的Agenda类标记为static,或者你需要创建AgendaWeb类的实例来访问Agenda作为它的属性。

答案 2 :(得分:0)

由于多个语法错误,您的代码无法编译。除此之外:

“this”指的是类的当前实例,而像static这样的main上下文存在于类级别,而不是实例级别。

static上下文中,不可能使用非静态变量。您应该创建一个类的实例并使用它。