【问题标题】:cannot find symbol error message找不到符号错误消息
【发布时间】:2012-05-06 09:38:04
【问题描述】:

在编写程序时,当我尝试从另一个类调用方法 setTextArea() 时,我收到“找不到符号消息”。编译程序后,我收到以下错误消息: 无法编译的源代码 - 错误的符号类型:gui.setTextArea

这是我的代码:

public class LinkExtractor {

    public static void main(String[] args) throws IOException {
        //Validate.isTrue(args.length == 1, "usage: supply url to fetch");
        String base = "http://uk.ask.com/web?q=";
        String keyword ="flowers";
        String tale="&search=&qsrc=0&o=312&l=dir";
        String url =base+keyword+tale;

        print("Fetching %s...", url);

        Document doc = Jsoup.connect(url).get();
        Elements links = doc.select("a[href]");

        print("\nLinks: (%d)", links.size());
        for (Element link : links) {
            print(" * a: <%s>  (%s)", link.attr("abs:href"), trim(link.text(), 35));
      AssistantGUI gui=new AssistantGUI();

        }
    }

    public static void print(String msg, Object... args) {
      ***//here is the problem line***
        gui.setTextArea(String.format(msg, args));

    }

    private static String trim(String s, int width) {
        if (s.length() > width)
            return s.substring(0, width-1) + ".";
        else
            return s;
    }
}

这是我的第二节课:

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;

public class AssistantGUI {
JFrame frame= new JFrame("TextArea frame");
JPanel panel=new JPanel();
JTextArea text= new JTextArea("",5,20);


public AssistantGUI(){

frame.add(panel);
panel.add(text);
frame.setSize(250,200);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}
public void setTextArea(String myString){
text.append(myString);
}
public static void main(String[] args){
AssistantGUI gui= new AssistantGUI();

gui.setTextArea("Hello");
}

}

我阅读了许多类似问题的帖子,但找不到解决方案。在我看来一切都很好。我正在创建一个 AssistantGUI 的实例,然后我用它来调用方法 setTextArea(),为什么它不能识别它?有任何想法吗?非常感谢您的帮助。

【问题讨论】:

    标签: java netbeans


    【解决方案1】:

    @RameshK 现在有一个正确答案。在面向对象的风格中:做这样的事情(使事情非静态):

    AssistantGUI gui = new AssistantGUI();
    
    public static void main(String[] args) throws IOException {
        new LinkExctractor().execute();
    }
    
    private void execute() {
        //Validate.isTrue(args.length == 1, "usage: supply url to fetch");
        String base = "http://uk.ask.com/web?q=";
        String keyword ="flowers";
        String tail = "&search=&qsrc=0&o=312&l=dir";
        String url = base + keyword + tail;
    
        print("Fetching %s...", url);
    
        Document doc = Jsoup.connect(url).get();
        Elements links = doc.select("a[href]");
    
        print("\nLinks: (%d)", links.size());
        for (Element link : links) {
            print(" * a: <%s>  (%s)", link.attr("abs:href"), trim(link.text(), 35));
        }
    }
    
    private void print...
    

    【讨论】:

      【解决方案2】:

      你还没有声明gui,所以它自然找不到它。用不同的方法声明局部变量不算数。

      【讨论】:

        【解决方案3】:

        在您的第一堂课中,您在 main 方法中实例化了一个 gui 局部变量。一旦退出 main 方法,该引用就会丢失,并且方法 print 找不到它。一个快速的解决方案是将 gui 设为类的静态成员(但这不是正确的方法)。

        考虑阅读此tutorial,但更重要的是,尝试摆脱所有那些static(除了必须保持静态的主要方法)并改用new,使用实例。

        【讨论】:

          【解决方案4】:

          您在 main 方法的第一个类中创建 gui 对象,它将充当局部变量。

          每当您从 print 方法调用 setTextArea 时,此处都不允许引用。

          所以在你的第一堂课上试试这些改动

          public class LinkExtractor {
              public static AssistantGUI gui=new AssistantGUI(); // create the object
              public static void main(String[] args) throws IOException {
                  //Validate.isTrue(args.length == 1, "usage: supply url to fetch");
                  String base = "http://uk.ask.com/web?q=";
                  String keyword ="flowers";
                  String tale="&search=&qsrc=0&o=312&l=dir";
                  String url =base+keyword+tale;
          
                  print("Fetching %s...", url);
          
                  Document doc = Jsoup.connect(url).get();
                  Elements links = doc.select("a[href]");
          
                  print("\nLinks: (%d)", links.size());
                  for (Element link : links) {
                      print(" * a: <%s>  (%s)", link.attr("abs:href"), trim(link.text(), 35));
          
          
                  }
              }
          
              public static void print(String msg, Object... args) {
                ***//here is the problem line***
                  gui.setTextArea(String.format(msg, args));
          
              }
          
              private static String trim(String s, int width) {
                  if (s.length() > width)
                      return s.substring(0, width-1) + ".";
                  else
                      return s;
              }
          }
          

          【讨论】:

          • 您必须将 gui 声明为静态才能使其工作。但我不建议这样做。 static 应该非常谨慎地使用,并且人们经常错误地使用它(就像这里的情况一样)。最终,您需要将所有内容都设置为静态,您会遇到麻烦。
          • 是的,你是对的,我们需要有静态引用.. 否则我们不允许使用像 main 这样的静态方法的引用...
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-19
          • 1970-01-01
          • 1970-01-01
          • 2012-11-10
          相关资源
          最近更新 更多