我在执行以下代码时遇到异常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);
}
}
答案 0 :(得分: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;
}
答案 1 :(得分:1)
尝试指定完全限定的类名。像
的Class.forName( “abc.xyz.SavingAccount”);
其中abc.xyz是SavingAccount类的包名。
答案 2 :(得分: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....
}
}
答案 3 :(得分:0)
它显示SavingAccount
上没有classpath
类。
答案 4 :(得分: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());
}
}
}
并遵循编译错误。