【问题标题】:Why am I getting this compile error?为什么我会收到此编译错误?
【发布时间】:2012-03-13 08:18:10
【问题描述】:

我需要在前面加上我不允许在课堂上使用 IDE,我必须使用 TextPad 来编译和运行。任何帮助将不胜感激。

这里有两个文件,一个叫做 Account,另一个叫做 Lab4B。任务是创建和使用以下文件: Lab4B.java = 分配的驱动程序代码类 (Lab4B) 的源代码 Account.java = Account 类的源代码

说明如下: 设计一个名为 Account 的类(包含

  1. 帐户的名为 id 的私有 int 数据字段(默认为 0)。
  2. 帐户的名为 balance 的私有双精度数据字段(默认为 0)。
  3. 一个名为 AnnualInterestRate 的私有双数据字段,用于存储当前利率(默认为 0)。假设所有帐户的利率相同。
  4. 一个名为 dateCreated 的私有日期数据字段,用于存储帐户的创建日期。
  5. 创建默认帐户的无参数构造函数。
  6. 创建具有指定 ID 和初始余额的帐户的构造函数。
  7. id、balance 和annualInterestRate 的访问器和修改器方法。
  8. dateCreated 的访问器方法。
  9. 名为 getMonthlyInterestRate() 的方法返回月利率。
  10. 一种名为withdraw 的方法,用于从帐户中提取指定金额。
  11. 一种名为 deposit 的方法,用于从帐户中存入指定金额。

我收到以下错误: 错误出现在我编译“Lab4B”文件时。

F:\Java\Lab 4b\Lab4B.java:13: error: cannot find symbol
   Account account = new Account(5544, 45000, 0.036);
   ^
  symbol:   class Account
  location: class Lab4B

F:\Java\Lab 4b\Lab4B.java:13: error: cannot find symbol
   Account account = new Account(5544, 45000, 0.036);
                         ^
  symbol:   class Account
  location: class Lab4B
2 errors

“账户”代码如下:

import java.util.Scanner;
import java.util.Date;

public class Account
{

    int id = 0;
    double balance = 0;
    double annualInterestRate = 0;
    Date dateCreated;


    public Account()
    {

    }

    public Account(int id, double balance, double annualInterestRate)
    {

    this.id = id;
    this.balance = balance;
    this.annualInterestRate = annualInterestRate;
    this.dateCreated = new Date();
    }

    public void setID (int id)
    {
    this.id = id;
    }


    public int getID()
    {
    return this.id;
    }


    public void setBalance (double balance)
    {
    this.balance = balance;
    }


    public double getbalance()
    {
    return this.balance;
    }


    public void setAnnualInterestrate (double annualInterestRate)
    {
    this.annualInterestRate = annualInterestRate;
    }


    public double getAnnualInterestrate()
    {
    return this.annualInterestRate;
    }


    public Date getDateCreated()
    {
    return this.dateCreated;
    }


    public double getMonthlyInterestRate()
    {
    return (this.annualInterestRate) / 12;
    }


    public void withdraw(double amount)
    {
    this.balance -= amount;
    System.out.println ("After withdrawing $"+amount +" the balance in your account is:                                                  $   " +this.balance +"\n");
    }


public void deposit(double amount)
{
    this.balance += amount;
    System.out.println(" After making a deposit of $"+amount +" the balance in your    account is: $"  +this.balance + "\n");
}
 }

Lab4B 文件的代码如下:

public class Lab4B
{

public static void main(String[] args)
{

   // Creates an instance of Account

   Account account = new Account(5544, 45000, 0.036);

   // Sets default amounts

   account.setID(5544);
   account.setBalance(45000);
   account.setAnnualInterestRate(0.036);
   account.withdraw(3700);
   account.deposit(2200);

   // Prints output

   System.out.println ("Account number: \n"+ +account.getID());
   System.out.println ("The account balance is: $ \n" + +account.getbalance());
   System.out.println ("The monthly interest earned is: $ \n" + +account.getbalance() *    account.annualInterestRate());
   System.out.println ("The account was created on: \n" + +account.getdateCreated());
 }
}

这是我从 javac 命令行编译器中得到的错误建议:

C:\>javac Lab4B.java
Lab4B.java:5: error: package mypackage does not exist
import mypackage.Account;
                ^
Lab4B.java:15: error: cannot find symbol
   Account account = new Account(5544, 45000, 0.036);
   ^
   symbol:   class Account
   location: class Lab4B
Lab4B.java:15: error: cannot find symbol
   Account account = new Account(5544, 45000, 0.036);
                         ^
  symbol:   class Account
  location: class Lab4B
3 errors

这里是 javac -verbose 输出:

C:\Users\kschultz>cd\

C:\>javac -verbose Lab4B.java
[parsing started RegularFileObject[Lab4B.java]]
[parsing completed 12ms]
[search path for source files: .C:\Program Files (x86)\Java\jdk1.7.0_02\lib,C:\P
rogram Files (x86)\Java\jre6\lib\ext\QTJava.zip]
[search path for class files: C:\Program Files (x86)\Java\jdk1.7.0_02\jre\lib\re
sources.jar,C:\Program Files (x86)\Java\jdk1.7.0_02\jre\lib\rt.jar,C:\Program Fi
les (x86)\Java\jdk1.7.0_02\jre\lib\sunrsasign.jar,C:\Program Files (x86)\Java\jd
k1.7.0_02\jre\lib\jsse.jar,C:\Program Files (x86)\Java\jdk1.7.0_02\jre\lib\jce.j
ar,C:\Program Files (x86)\Java\jdk1.7.0_02\jre\lib\charsets.jar,C:\Program Files
 (x86)\Java\jdk1.7.0_02\jre\classes,C:\Program Files (x86)\Java\jdk1.7.0_02\jre\
 lib\ext\dnsns.jar,C:\Program Files (x86)\Java\jdk1.7.0_02\jre\lib\ext\localedata
 .jar,C:\Program Files (x86)\Java\jdk1.7.0_02\jre\lib\ext\sunec.jar,C:\Program Fi
 les (x86)\Java\jdk1.7.0_02\jre\lib\ext\sunjce_provider.jar,C:\Program Files (x86
 )\Java\jdk1.7.0_02\jre\lib\ext\sunmscapi.jar,C:\Program Files (x86)\Java\jdk1.7.
 0_02\jre\lib\ext\sunpkcs11.jar,C:\Program Files (x86)\Java\jdk1.7.0_02\jre\lib\e
 xt\zipfs.jar,.C:\Program Files (x86)\Java\jdk1.7.0_02\lib,C:\Program Files (x86)
\Java\jre6\lib\ext\QTJava.zip]
[loading ZipFileIndexFileObject[C:\Program Files (x86)\Java\jdk1.7.0_02\lib\ct.s
ym(META-INF/sym/rt.jar/java/lang/Object.class)]]
[loading ZipFileIndexFileObject[C:\Program Files (x86)\Java\jdk1.7.0_02\lib\ct.s
ym(META-INF/sym/rt.jar/java/lang/String.class)]]
[checking Lab4B]
[loading ZipFileIndexFileObject[C:\Program Files (x86)\Java\jdk1.7.0_02\lib\ct.s
ym(META-INF/sym/rt.jar/java/lang/AutoCloseable.class)]]
Lab4B.java:13: error: cannot find symbol
    Account account = new Account(5544, 45000, 0.036);
    ^
  symbol:   class Account
  location: class Lab4B
 Lab4B.java:13: error: cannot find symbol
    Account account = new Account(5544, 45000, 0.036);
                          ^
  symbol:   class Account
  location: class Lab4B
 [loading ZipFileIndexFileObject[C:\Program Files (x86)\Java\jdk1.7.0_02\lib\ct.s
 ym(META-INF/sym/rt.jar/java/lang/System.class)]]
 [loading ZipFileIndexFileObject[C:\Program Files (x86)\Java\jdk1.7.0_02\lib\ct.s
 ym(META-INF/sym/rt.jar/java/io/PrintStream.class)]]
[loading ZipFileIndexFileObject[C:\Program Files (x86)\Java\jdk1.7.0_02\lib\ct.s
ym(META-INF/sym/rt.jar/java/io/FilterOutputStream.class)]]
[loading ZipFileIndexFileObject[C:\Program Files (x86)\Java\jdk1.7.0_02\lib\ct.s
ym(META-INF/sym/rt.jar/java/io/OutputStream.class)]]
[total 228ms]
2 errors

【问题讨论】:

  • 你用来编译的命令行是什么? Lab4B.java 是否与Account.java 在同一目录中?你能显示F:\Java\Lab 4b的目录列表吗?

标签: java


【解决方案1】:

您的两个错误都与同一个问题有关。

Lab4B.java:5: error: package mypackage does not exist
Lab4B.java:15: error: cannot find symbol

问题

  • 您的 Account 类不包含包声明。 (检查 Account 类是否真的在“mypackage”目录中)
  • 您的 Lab4B 类不包含包导入。

解决方案

包声明语法

package mypackage;
import java.util.Scanner;
import java.util.Date;
public class Account {
   //rest of the code

语句顺序如下。

  1. 包装说明(可选)。
  2. 导入(可选)。
  3. 类或接口定义。

包导入语法

import mypackage.Account;
public class Lab4B
{
   //rest of code

您可以通过 3 种方式指定包导入。

JOptionPane 类在 swing 包中,它位于 javax 包中。通配符 (*) 用于指定包含该包的所有类都可用于您的程序。这是最常见的编程风格。

import javax.swing.*;  // Make all classes visible altho only one is used.

class ImportTest {
    public static void main(String[] args) {
        JOptionPane.showMessageDialog(null, "Hi");
        System.exit(0);
    }
}

可以在导入时明确指定类,而不是使用通配符。

import javax.swing.JOptionPane;  // Make a single class visible.

class ImportTest {
    public static void main(String[] args) {
        JOptionPane.showMessageDialog(null, "Hi");
        System.exit(0);
    }
}

或者,我们可以在没有导入的情况下使用完全限定的类名。

class ImportTest {
    public static void main(String[] args) {
        javax.swing.JOptionPane.showMessageDialog(null, "Hi");
        System.exit(0);
    }
}

你可以阅读更多关于包的信息here

【讨论】:

    【解决方案2】:

    当 Java 编译器编译 Lab4B.java 时,它希望能够找到(或编译)Account 类。编译器说它找不到Account 类。

    这个问题的几种可能性:

    • “Account.java”与“Lab4B.java”不在同一目录中 - 请注意,名称区分大小写。如果文件名为“account.java”,编译器将找不到Account 类。

    • “Account.java”不应与“Lab4B.java”位于同一目录中 - 如果是这种情况,则它位于不同的包中。您要么需要import 可以找到Account 类的包,要么在引用Lab4B 类中的Account 类时需要指定完整的包名。您还需要确保 CLASSPATH 配置正确(如果适用)。


    根据编译器的-verbose 输出更新:

    问题似乎是因为某些东西将 Java 编译器的源路径设置为不正确的值:

    [search path for source files: .C:\Program Files (x86)\Java\jdk1.7.0_02\lib,C:\Program Files (x86)\Java\jre6\lib\ext\QTJava.zip]
    

    问题是当前目录不在搜索路径中(. 已与另一个没有分隔符的路径连接)。看起来您有一个错误的 CLASSPATH 环境变量,在类路径配置的 . 部分之后没有分号。

    修复这个问题,编译器应该能够找到Account.java。然后,由于源文件中的拼写错误,您会得到一些编译器错误,这些错误应该很容易修复。

    【讨论】:

    • 这里是路径,F:\Java\Lab 4b。它们都在同一个目录中。 F:\Java\Lab 4b\Account.java & F:\Java\Lab 4b\Lab4B.java。类路径如下: .C:\Program Files (x86)\Java\jdk1.7.0_02\lib;C:\Program Files (x86)\Java\jre6\lib\ext\QTJava.zip 系统变量路径为: C:\Program Files (x86)\Pervasive Software\PSQL\bin\;;c:\Program Files (x86)\Microsoft SQL Server\90\Tools\bin\;C:\Program Files (x86)\Common Files \Netop\;C:\Program Files (x86)\Java\jdk1.7.0_02\bin;
    • 看起来javac 应该可以找到Account.java,所以我不确定发生了什么。尝试javac -verbose Lab4B.java 并将输出发布到问题的底部。
    • 文件在同一个目录下,@Michael Burr 我听不懂你在说什么。
    • @Kevin:如果您使用命令行运行 Java 编译器:javac -verbose Lab4B.java,它会吐出几行诊断信息,可能会阐明问题。使用剪贴板将这些行复制到您的问题中(使用[java][homework] 标签按钮下的“编辑”链接)。
    • @Kevin:很抱歉后退,但命令行中缺少-verbose 选项。而且您应该删除 import mypackage.Account; 行,因为您显然不需要导入包。即使您确实需要导入一个包,它也几乎肯定会使用与mypackage 不同的名称。
    【解决方案3】:

    您需要在 Lab4B 类中导入 Account 类。类似的东西:

    import mypackage.Account;
    

    将此放在Lab4B 类的顶部,在任何其他代码之前。

    希望这会有所帮助。

    【讨论】:

    • 这似乎不起作用。除了原来的错误,我现在还有以下错误。 F:\Java\Lab 4b\Lab4B.java:5: 错误:包 mypackage 不存在 import mypackage.Account; ^ F:\Java\Lab 4b\Lab4B.java:15: 错误:找不到符号 Account account = new Account(5544, 45000, 0.036); ^ 符号:类帐户位置:类 Lab4B F:\Java\Lab 4b\Lab4B.java:15: 错误:找不到符号 Account account = new Account(5544, 45000, 0.036); ^ 符号:类帐户位置:类 Lab4B 3 个错误
    猜你喜欢
    • 2023-03-05
    • 2018-06-22
    • 2016-01-01
    • 1970-01-01
    • 2017-07-24
    • 1970-01-01
    • 2012-02-19
    相关资源
    最近更新 更多