2

可能重复:
使用 java 反射的 ClassnotFound 异常

java.lang.ClassNotFoundException: SavingAccount执行以下代码时出现异常,

public class AccountFactory {   
    public void getAccount()
    {
        IAccount account;
        account = null;
     try
        {
         account = (IAccount)Class.forName("SavingAccount").newInstance();
         account.Deposit(500);
        }
        catch(Exception e)
        {
            System.out.println(e.toString());
        }  
    }

}

导致错误的可能原因是什么?

这是我的储蓄账户代码:

public class SavingAccount implements IAccount {
    int money;
    SavingAccount()
    {
        money =0;
    }
    public void WithDraw(int m)
    {
        money--;
    }
    public void Deposit(int m)
    {
        money++;
        System.out.println(money);
    }
}
4

5 回答 5

4

类加载器找不到 SavingsAccount 类。在使用Java API中指定的 Class.forName 方法时,您还需要使用类的完全限定名称。完全限定的类名包括以包结构为前缀的类名。如果您的 AccountFactory 类每次总是要创建一个 SavingsAccount 类型的类,我建议您甚至不使用 AccountFactory 类,而只使用:

IAccount account = new SavingsAccount();

如果发布的代码只是您的类的快照,并且您确实打算从您的工厂返回实现 IAccount 接口的不同类型,您将需要更改 getAccount 方法签名,以便它返回 IAccount 而不是 void。然后,您必须使用 return 语句返回一个实现 IAccount 接口的对象。如:

 public IAccount getAccount()
 {
     IAccount account;
     account = null;
     try
        {
         //Notice fully qualified name is used.
         account = (IAccount)Class.forName("org.mydomain.SavingAccount").newInstance();
         account.Deposit(500);
        }
        catch(Exception e)
        {
            System.out.println(e.toString());
        } 
     return account;
}
于 2012-09-23T09:58:23.317 回答
1

尝试指定完全限定的类名。像

Class.forName("abc.xyz.SavingAccount");

其中 abc.xyz 是 SavingAccount 类的包名。

于 2012-09-23T10:00:50.470 回答
1

AccountFactory一定已经结束了IAccount。我认为它用于根据要求返回所有实现的实例IAccount。但是,我假设您知道所有类都在实现您的IAccount. 所以,没有必要使用 Class.forName()。

我假设您的设计如下所示:-

public interface IAccount {
}

public class SavingsAccount implements IAccount {
}

public class CurrentAccount implements IAccount {

}

public class AccountFactory {
     public static IAccount getAccountInstance(String class) {   
     // In your code you need to change the return type of this method..

          if (class.equals("Savings")) {
                 return new SavingAccounts();
          } else if (class.equals("Current")) {
                 return new CurrentAccount();
          } 
          // Similarly for Other implementor....
     }
}
于 2012-09-23T10:05:09.070 回答
0

它显示SavingAccount该类不在classpath.

于 2012-09-23T09:49:46.710 回答
0

public class AccountFactory {   
    public void getAccount()
    {
        IAccount account;
        account = null;
     try
        {
         account = new SavingAccount();
         account.Deposit(500);
        }
        catch(Exception e)
        {
            System.out.println(e.toString());
        }  
    }        
}

并遵循编译错误。

  1. 您可能会看到为什么找不到 SavingAccount(不在类路径中?错误的包(即“mypackage.SavingAccount”?))
  2. 你看看 SavingAccount 是否实现了 IAccount 接口。
于 2012-09-23T09:57:12.270 回答