Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > non-static и static context


Автор: brejnev 19.9.2005, 17:47
Только начал изучать Java, возник вопрос. Есть исходник
Код


import java.sql.*;
import java.io.*;
import java.util.*;

public class MainDlg extends javax.swing.JFrame {
    public MainDlg() {
        initComponents();
    }
  
    private void initComponents() { /*...*/ } /*создание gui, код сгенерен NetBeans */

    
    public static void main(String args[]) {

        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new MainDlg().setVisible(true);
                execSQL();        
           }              
      });
    }

    public void execSQL()

    {
        try{
            Connection conn = getConnection();
            Statement stat = conn.createStatement();
           
            ResultSet res = stat.executeQuery("SELECT * FROM Publisher");         
            res.first();
            
            while( res.next() ){
                jComboBox1.addItem( res.getString("Name") );           // вот здесь ошибка       
            }
         
            res.close();
                        
            stat.close();
            conn.close();
            
        }
        catch( SQLException e ){ 
            while( e!=null ){
                e.printStackTrace(  );
                e=e.getNextException();
            }
        }
        catch( IOException e ){
            e.printStackTrace();
        }
    }

    public static Connection getConnection( ) 
        throws SQLException, IOException 
    {/*...*/ }
 
    /*private члены*/     
    ...
    private JComboBox jComboBox1;          
    ...
}


на строке jComboBox1.addItem( res.getString("Name") ) компилятор ругается "non-static method execSQL() cannot be referenced from a static context" - как это обойти?

Автор: allex 19.9.2005, 17:55
Ругается компилятор не на эту строку, а на вызов execSQL() из main(). Необходимо указать объект, для которого вызывается метод.

Код

MainDlg dlg = new MainDlg();
dlg.setVisible(true);
dlg.execSQL();    


Автор: brejnev 19.9.2005, 18:13
Решил проблему, код генерит NetBeans и по-этому я решил не трогать, то что он там натворил. Код
Код

   public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
               new MainDlg().setVisible(true);
        }
        });
        MainDlg.execSQL();    
    }

так же не работает. Если execSQL расписать, то ошибку компилятор покажет на строке, с jComboBox. Я просто вынес execSQL() в конструктор
Код

    public MainDlg() {
        initComponents();
        execSQL(); 
    }

Работает, только первую строку sql-запроса не пропускает, но это я уж сам разберусь smile
А в общем, ничего плохого, что execSQL() оказалось в конструкторе?

Автор: batigoal 19.9.2005, 21:50
Цитата(brejnev @ 19.9.2005, 19:13)
А в общем, ничего плохого, что execSQL() оказалось в конструкторе?

Особо, наверное, ничего, но по смыслу нехорошо...

А вообще, советую код руками полностью писать, особенно поначалу. Полезнее.

Автор: bars_uz 21.9.2005, 10:35
Ya toje rekomenduyu prisat ruchnuyu...
A to esli v dolneyshem budete pisat sereoznie proekti u Vas mogut voznika bolshie problemi..

Автор: Macross 26.9.2005, 10:37
В документации написано, что static методы могут обращаться только к static методам.
В статик методе сначала нужно создать объект а затем обращаться к его методам.
Это должно работать:
Код

public static void main(String args[]) {    
        java.awt.EventQueue.invokeLater(new Runnable() {    
            public void run() {    
               new MainDlg() md=new MainDlg();
               md.setVisible(true);    
               md.execSQL();
        }    
        });            
    }

А по поводу того, что net bins сам сгенерировал код и лутше его не трогать скожу так - создал, то он его создал, но вот изменять то не запретил, в отличии от метода initComponents(). Это к тому, что всех нюансов генератор кода предусмотреть не может и править код вполне можно и даже нужно. Генератором нужно пользоваться для сокращения рутинной работы а с кодом вы сами вольны делать, что хотите, главное понимать, что вы делаете smile .

Для ярых поклоников генераторов можно попробывать execSQl() сделать static возможно еще понадобиться и все переменные и методы используемые в execSQL() также сделать static, но это уже в сторону извращений.

Автор: batigoal 26.9.2005, 14:47
Macross - пожалуйста, пользуйся кнопкой "Код" - так нагляднее.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)