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 メソッドのシグネチャを変更して、void ではなく IAccount を返すようにする必要があります。次に、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

あなたAccountFactoryは終わったに違いないIAccountIAccount要件に基づいてのすべての実装のインスタンスを返すために使用されると思います。しかし、すべてのクラスが自分のを実装しているものを知っていると思います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 に答える
1

完全修飾クラス名を指定してみてください。お気に入り

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

abc.xyz は SavingAccount クラスのパッケージ名です。

于 2012-09-23T10:00:50.470 に答える
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 に答える