2016-12-16 47 views
3

我偶然遇到一个有趣的错误,我需要你帮我弄明白。为什么在扩展TestCase类时无法找到或加载主类

为下面的代码,每一件事情是确定的:

public class HelloWorld{ 
    public static void main(String[] args){ 
     System.out.println("hello world"); 
    } 
} 

则作为后续的代码,一些有趣的事情来了。

import junit.framework.TestCase; 

public class HelloWorld extends TestCase{ 
    public static void main(String[] args){ 
     System.out.println("hello world"); 
    } 
} 

当我运行它,它说

无法找到或加载主类。

我知道当jvm负载HelloWorld class它会首先加载TestCase class。所以我做了下面的代码段。

public class HelloWorld { 
    public static void main(String[] args) throws ClassNotFoundException{ 
     Class.forName("junit.framework.TestCase"); 
    } 
} 

异常线程 “main” 抛出java.lang.ClassNotFoundException:junit.framework.TestCase类

我不知道为什么?也许TestCase类不在我的类路径上?但至于第二代码段我确保TestCase在我的类路径


所以我的问题是:

  1. 为什么我不能加载TestCase类?
  2. 为什么在扩展TestCase类时找不到或加载主类?

注:我知道打印的HelloWorld功能有什么用TestCase class其用于JUnit测试但我想弄清楚,把这个惊喜的原因。

+1

你没有告诉我们你是如何运行代码的。它确实看起来像junit不在类路径中......(另外,在格式化问题时学习使用Markdown是一个好主意 - 并且尽量避免使用引用和代码来处理列表和笔记。) –

+0

我在日食中运行它,我会更新我的帖子。 –

+2

那么如何确保JUnit在Eclipse的类路径中?你是否尝试过使用显式类路径从命令提示符运行它? –

回答

4

我不知道为什么?也许TestCase类不在我的类路径中?但是,对于第二个代码段,我确保TestCase位于我的类路径中,但是 。

Class.forName("junit.framework.TestCase"); 

返回与TestCase类相关联的类对象。它不设置类路径。

这就是为什么你上升的异常:在线程

异常 “主要” 抛出java.lang.ClassNotFoundException: 的junit.framework.TestCase

您尝试加载类,这是不在类路径中。

要解决您在Eclipse中遇到的问题,请进入项目的属性窗口,然后在左侧选择Java Build Path选项,进入内部并查看库选项卡。在这里,如果您希望JUnit位于类路径中,您应该添加JUnit库。

+0

“它与类路径无关,它是在java编译或正在运行的任务期间指示可用类和资源路径的路径。”这非常具有误导性。 'Class.forName'非常依赖于类路径。你似乎明白,对于你的答案的其余部分,所以目前还不清楚为什么你说它与类路径“没有关系”。 –

+0

你是绝对正确的。没有花时间重读我。我修改了它。试图在火车上作出全面的回应可能不是最好的主意:) @Jon Skeet – davidxxx

+0

这绝对是更好:) –

相关问题