Java- java.lang.NoClassDefFoundError,类路径不是问题

时间:2014-04-20 18:11:20

标签: java runtime ubuntu-12.04 noclassdeffounderror

我正在写一个家庭作业的程序,并遇到一个我似乎无法解决的问题。问题涉及模拟在任何给定节点上结束的随机行走的概率(只是背景,与问题无关)。我编写了自己的类,它使用哈希映射来保存节点对象(分别是UndirectedGraph和NodeEntry)。我还写了一个测试工具。

最初所有这些都在一个文件中,但我决定将UndirectedGraph和NodeEntry移动到一个单独的包中...因为这似乎是正确的事情。我已经修复了所有内容,以便testHarness可以编译,但在运行时我得到以下内容:

Exception in thread "main" java.lang.NoClassDefFoundError: GraphWalker/NodeEntry
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2531)
at java.lang.Class.getMethod0(Class.java:2774)
at java.lang.Class.getMethod(Class.java:1663)
at sun.launcher.LauncherHelper.getMainMethod(LauncherHelper.java:494)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:486)
Caused by: java.lang.ClassNotFoundException: GraphWalker.NodeEntry
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    ... 6 more

从环顾四周我找到了一些答案,主要是这些类不在类路径上。事情是我将所有这些文件放在同一个文件夹中,我的理解是当前文件夹始终在类路径中。

这里是代码的缩写副本:

testHarness:

import java.util.*;
import GraphWalker.*;

public class testHarness {

    public static void main (String args[]) {
        new testHarness();
    }


    public testHarness() {
        GraphWalker.UndirectedGraph graph = new GraphWalker.UndirectedGraph(3);
//      System.out.println(graph.containsNode(1));
        graph.addNode(1);
        graph.addNode(2);
        graph.addNode(3);

UndirectedGraph:

package GraphWalker;
import java.util.*;

public class UndirectedGraph {

    /* 
     * Based in part on UndirectedGraph.java by Keith Schwarz (htiek@cs.stanford.edu) 
     */

    public HashMap graphMap;

    public UndirectedGraph(int numNodes) {
        this.graphMap = new HashMap(numNodes);
    }

    public void addNode (Integer nodeNum) {
        graphMap.put(nodeNum, new NodeEntry(1.0f,0.0f));
    }

NodeEntry:

package GraphWalker;
import java.util.*;


public class NodeEntry {

    // four inherent values
    // credit is the current credit of the node
    // nextCredit holds the credit for the next step
    // adjList holds a list of adjacent node IDs 
    // degree holds the number of neighbors
    public Float credit;
    public Float nextCredit; 
    public ArrayList adjList;
    public Integer degree;


    public NodeEntry(Float credit, Float nextCredit) {
        this.credit = credit;
        this.nextCredit = nextCredit;
        this.adjList = new ArrayList();
        this.degree = 0;
    }


    public void addEdge(Integer neighbor) {
        this.adjList.add(neighbor);
        this.degree += 1;
    }

每个类都有相当多的代码,但我不认为它与问题有关。我正在研究Ubuntu 12.04并尝试从两个命令行编译和运行,并使用Geany(简单IDE)相同的行为。

任何帮助?

1 个答案:

答案 0 :(得分:0)

Alrighty, 问题是包文件需要在一个单独的文件夹中(以包的名称命名,在我的例子中是GraphWalker)。我并不完全清楚为什么它编译得很好但是在运行时它去寻找它似乎预期/要求它们在自己的文件夹中的包。

我不会认为类路径问题本身,因为要查找的文件位于类路径中的文件夹中,而不是它们所需的文件夹。