Java Class.forName方法java.lang.ClassNotFoundException;

时间:2014-03-16 04:51:48

标签: java class classnotfoundexception classnotfound

我找到了人们拥有的其他线索并解决了这个错误;但是,所有这些都没有使用完全限定的类路径。我似乎无法使Class.forName工作,我使用完全限定的路径。

我已经测试了从CLI编译并使用ItelliJ Idea。两者都失败并出现同样的错误。

代码(在测试目录中):

package test;
public class Test {
  public static void main(String[] args) {
    Class cls = Class.forName("java.util.ArrayList");
  }
}

错误:

  

抛出java.lang.ClassNotFoundException;必须被抓住或宣布被抛出

上面的例子不起作用。提前谢谢!

5 个答案:

答案 0 :(得分:5)

您收到此邮件是因为ClassNotFoundException是已检查的例外。这意味着不能忽略此异常。您需要使用try/catch构造包围它并提供异常处理或向您的方法添加throws子句并在被调用者中处理它。

修改 请注意,编译期间未解析Class.forName()构造。当您编写这样的语句时,您告诉JVM在程序执行期间查找可能尚未加载的类。 Java库是动态链接的,而不是静态链接的,这意味着它们的代码未包含在程序代码中,只在请求时才加载。这就是它抛出ClassNotFoundException的原因。

答案 1 :(得分:1)

声明

Class.forName("java.util.ArrayList")方法抛出已检查的异常ClassNotFoundException,因此您必须在try/catch块中处理它,如下所示

package test;
public class Test {
  public static void main(String[] args) {
    try {
        Class cls = Class.forName("java.util.ArrayList");
    } catch (ClassNotFoundException e) {
    // Handle it here
    }
  }
}

答案 2 :(得分:1)

试试这个:

try{
  Class cls = Class.forName("java.util.ArrayList");
}catch(ClassNotFoundException e){
  ... do messaging or logging
}
方法签名中的

throw ClassNotFoundException

public static void main(String[] args) throws ClassNotFoundException {

答案 3 :(得分:0)

有两种选择:

  1. 使用try-catch块进行环绕并进行一些适当的处理:

    package test;
    public class Test {
      public static void main(String[] args) {
        try {
            Class cls = Class.forName("java.util.ArrayList");
        } catch(ClassNotFoundException e)  {
            System.out.println("This is not a very serious exception, or at least Test knows how to handle it");
        }
      }
    }
    
  2. 将它扔到方法之外,希望某些调用方法知道该怎么做。

    package test;
    public class Test {
      public static void main(String[] args) throws ClassNotFoundException {
        Class cls = Class.forName("java.util.ArrayList");
      }
    }
    

答案 4 :(得分:0)

我不知道为什么上述答案都无法解释为什么会发生此错误。我也不能,但我曾经遇到过这个问题并使用

解决了这个问题

Thread.currentThread().getContextClassLoader().loadClass($YOUR_CLASS_NAME)

希望它可以解决您的问题,并希望有人可以给我们解释。