【问题标题】:Javac error: Cannot find SymbolJavac 错误:找不到符号
【发布时间】:2013-07-23 23:45:36
【问题描述】:

我编写了几个程序并编译了其中一些程序,但我知道我编写了一个聊天信使程序。当我编译服务器或客户端时,我总是从 javac 得到一个错误。 “错误:找不到符号”。并且两个错误都在其他类的构造函数中,应该如何在那里构造。 示例:

Chat.java:11  error: cannot find symbol
                       Frame frm = new Frame();
                                       ^
Symbol:   class Frame
location: class Chat
Chat.java:11  error: cannot find symbol
                       Frame frm = new Frame();
                       ^
Symbol:   class Frame
location: class Chat

主要

package main;

public class Chat {

public static void main(String args[]){

    Frame frm = new Frame();

    frm.setLayout(null);
    frm.setVisible(true);
    frm.setSize(800, 600);
    frm.setResizable(false);
    // a loop who wait for an true boolean
    frm.abfrage();

    while(true){
        frm.readChat();
    }
}

}

没有函数的FRAME类(只有构造函数)

package main;

//action + windowlistener + event import;

//Inputreader,writer,reader and IOException import;

//socket import + exception;

//.. there are some Javax.swing imports;

public class Frame extends JFrame {

Client client;

JPanel textPanel;
static boolean start;
static JTextArea messengerText;
JTextField writenText;
JTextField portInfo;
JTextField hostInfo;
JButton senden;
JButton connect;

public String writenString;
public String chatString;
int port;
String adress;

public Frame(){
    super("Chat by lionlak");

//      this.client = client;

    client = new Client("localhost",5483);

    setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
    //Deklarationen
    start = false;
    writenString = "Hallo vom Client";
    chatString = "Chat by lionlak";

    //Konstruktoren
      //JPanel
    textPanel = new JPanel();
      //JTextField
    writenText = new JTextField();
    portInfo = new JTextField();
    hostInfo = new JTextField();

    messengerText = new JTextArea();
      //JButton
    senden = new JButton("SENDEN");
    connect = new JButton("Connect");
    //Listener
    senden.addActionListener(new actionListener());
    connect.addActionListener(new actionListener());

    addWindowListener(new windowHandler());

    //Eigenschaften
      //JPanel
    textPanel.setLayout(null);
    textPanel.setBounds(10,150,490,780);
      //JTextField
    portInfo.setBounds(120,10,100,40);
    portInfo.setText("5483");
    hostInfo.setBounds(10, 10, 100, 40);
    hostInfo.setText("127.0.0.1");
    messengerText.setBounds(0,0,380,290);
    messengerText.setText(chatString);
    writenText.setBounds(0, 310, 280, 100);
    writenText.setText("Deine Nachricht!");
      //JButton
    senden.setBounds(290, 310, 100, 40);
    connect.setBounds(230, 10, 100, 40);

    //Add
    textPanel.add(messengerText);
    textPanel.add(writenText);
    textPanel.add(senden);
    add(hostInfo);
    add(portInfo);
    add(connect);
    add(textPanel);
}

【问题讨论】:

  • 导入 java.awt.Frame;
  • 您需要包含更多信息。例如,使用Frame 的代码。目前,大多数人认为您指的是java.awt.Frame,但您可能不是。
  • 我的建议是:使用像 Eclipse 这样的 IDE,它会有所帮助。并且,显然,学习足够的 Java 来理解基础。
  • 我通常使用 IDE,但我想让它为朋友运行。而且我了解 Java 基础知识,否则无法编写类似的东西。但我肯定不像这里注册的人那样了解。

标签: java javac


【解决方案1】:

在你的 Chat.java 中,你引用了你自己的 Frame.class,它位于同一个包中。所以不需要导入。

但是编译器必须可以访问 Frame.class,要么将其添加到编译器的类路径中,要么通过在单个编译调用中编译所有 java 文件更好。 例如:

javac Frame.java Chat.java

一个问题可能是 Frame.java 存在编译错误,导致无法编译,因此没有 Frame.class。

【讨论】:

  • 他们说我必须导入这个,这也是假的吗?而且,我怎样才能拥有类路径,或者如何一次调用全部编译?用 javac *.java 吗?因为当我用 javac *.java 编译它然后尝试启动它时,我得到一个 NoClassDefFoundError。
  • 如果你想使用自己的Frame.class,那么你不能导入任何其他Frame.class,否则系统会使用错误的。我在 1996 年学习 Java 时,曾经使用 javac *.java 进行编译,但很久以前我转而使用 IDE,如 eclipse 或 netbeans。因此,我不确定在命令行上使用 javac 编译时是否有一些变化。由于注销已经提到它对问题的评论,我还建议使用 IDE,因为它消除了这类技术问题(但可能会引入其他问题)
  • 我使用IDE,但是我想让它可以运行给朋友,因为这是给他的。那么我怎样才能让它可以运行给其他人呢?
  • @AlexanderKnotek “让它可以为朋友运行”——这句话是什么意思:a)你的朋友应该能够编译类或 b)你的朋友应该能够运行用java main.Chat编译的类?如果是 b),那么您可以使用 IDE 并将编译后的类导出为 jar 文件。
  • @投反对票的人:我可以问一下投反对票的原因,因为我在这里没有看到任何解释的评论吗?
【解决方案2】:

您需要在文件开头添加以下导入行:

import java.awt.Frame;

根据您的喜好,如果您使用 java.awt 包中的其他类,您可能想要使用这个:

import java.awt.*;

【讨论】:

  • 可能是个愚蠢的问题,但是当我导入这个时,我怎么能从 Frame 调用函数呢?
  • 您无需更改任何内容。您只需要添加导入行。然后,您可以调用Frame 函数而无需更改任何内容。
  • @AlexanderKnotek Frame 是一个位于 java.awt 包中的类。当您说Frame frm = new Frame(); 时,这意味着您正在创建 Frame 类的实例。通过该实例,您可以调用可用的方法。
  • 您尝试导入了吗?还有,你要哪个框架?
  • @AlexanderKnotek 查看我的答案。有很多有用的链接。希望它能澄清事情。
【解决方案3】:

所有答案都说要导入java.awt.Frame,但是,您可能需要导入其他一些Frame 类。这个 Frame 类将属于您尝试编译的 API 包。

【讨论】:

  • 问题是当我 iport java.awt.Frawe 比我的方法出错时!类型框架的方法未定义
  • 是的,我知道,不要那样做。你需要一个不同的Frame 类。
猜你喜欢
  • 1970-01-01
  • 2016-12-07
  • 1970-01-01
  • 1970-01-01
  • 2018-12-16
  • 1970-01-01
  • 1970-01-01
  • 2022-07-30
  • 1970-01-01
相关资源
最近更新 更多