1

我现在正在为我的编程课编写一个文本编辑器项目,当我尝试运行它时遇到了一个我以前从未见过的错误。这是一个相当长的解释,但基本上,我正在使用一个编辑器类,它使用其他几个类来创建一个链表,在其中存储一个文本文件,然后允许修改文件。我应该在 linux 环境中运行它,并且有问题的文件应该作为“命令行”参数输入。但是,每次我尝试运行它时,都会出现以下错误

Exception in thread "main" java.lang.NoClassDefFoundError: myEditor
Caused by: java.lang.ClassNotFoundException: myEditor
    at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
Could not find the main class: myEditor. Program will exit.

至于程序本身:

import java.util.Scanner;
import java.util.Iterator;
import java.io.*;

public class myEditor {

    public static void saveToFile(String text, String filename) throws IOException{
        PrintWriter out = new PrintWriter(new File(filename));
        out.println(text);
        out.close();
    }

    public static void main(String args[])  {
        boolean quit = false;
        try {
            if(args.length!=1)  {
                throw new IllegalArgumentException();
            }

            String filename = args[0];
            Scanner input = new Scanner(new File(filename));
            //Add exception
            UnorderedList<String> list = new UnorderedList<String>();
            while(input.hasNextLine())  {
                if(list.head==null) {
                    list.addToFront(input.nextLine());
                }
                list.addToRear(input.nextLine());
            }

            System.out.println(">");

            do  {
                Scanner command = new Scanner(System.in);
                String comm = command.next();
                String[] comm1 = comm.split(" ");

                if(comm1[0].equalsIgnoreCase("I")&&comm1[1].equals("")) {
                    System.out.println("Type a line of text >");
                    comm = command.next();
                    list.addToRear(comm);
                }

                else if(comm1[0].equalsIgnoreCase("I")&&!comm1[1].equals(""))   {
                    int linNum = Integer.parseInt(comm1[1]);
                    Iterator<String> itr = list.iterator();
                    String current = "";
                    for(int count=0;count<linNum;count++)   {
                        current = itr.next();
                    }
                    list.addAfter(comm, current);
                }

                else if(comm1[0].equalsIgnoreCase("D")&&!comm1[1].equals(""))   {
                    int linNum = Integer.parseInt(comm1[1]);
                    if(linNum<=list.count&&linNum>0)    {
                        Iterator<String> itr = list.iterator();
                        String current = "";
                        for(int count=0;count<linNum;count++)   {
                            current = itr.next();
                        }
                        list.remove(current);
                    }
                }

                else if(comm1[0].equalsIgnoreCase("L")) {
                    list.toString();
                }

                else if(comm1[0].equalsIgnoreCase("E")&&!comm1[1].equals(""))   {
                    saveToFile(list.toString(), filename);
                    quit = true;
                    break;
                }
            }
            while(!quit);
        }
        catch(IllegalArgumentException e)   {
            System.err.print(e.getMessage());
        }
        catch(FileNotFoundException e)  {
            System.err.print(e.getMessage());
        }

        catch(IOException e)    {
            System.err.print(e.getMessage());
        }

    }
}

显然,我在这个类中使用了很多其他类,但在我看来,错误并不在于它们。有没有人有这种错误的经验?

编辑:我几乎忘了提到,通过命令行参数,我的意思是应该使用的文件应该已经在它所在的 linux 目录中。它显然应该占用 args[0]

4

3 回答 3

2

java.lang.classNotFoundException 出现在以下情况:

1) 当我们尝试使用 Class.forName() 方法加载一个类时,类路径中没有 .class 文件或类的二进制文件。

2) 当 Classloader 尝试使用 findSystemClass() 方法加载一个类时。

3) 在 Java 中使用 ClassLoader 类的 loadClass() 方法时。

所以很明显 jvm 无法找到你的类。现在的问题是谁会告诉 jvm 在哪里寻找一个类?答案是——CLASSPATH 环境变量。

因为 Classpath 是一个参数——可以在命令行上设置,也可以通过环境变量设置——它告诉 Java 虚拟机或 Java 编译器在哪里寻找用户定义的类和包。

因此,您可以像往常一样在运行时 "java $CLASSPATH:. myEditor"或环境中设置 CLASSPATH 以查找当前目录,它将解决问题。

在 linux 变体上,您可以在 .bashrc 文件中设置它(如果使用 bash),可以使用 set 命令,可以在 .bash_profile 中设置。在 Windows 上,您会在“系统--> 属性”中找到相同的内容

于 2013-10-16T02:16:57.590 回答
0

错误是说它在运行时找不到类 myEditor但是在编译时存在。在我的测试中,当我运行课程并且我遗漏了一些东西时,它会给我那个确切的错误。您的所有课程都在同一个地方(或组织得当)吗?尝试查看您需要的所有 .class 文件并确保它们都在那里。如果您提供有关如何编译和运行它的更多详细信息,我可以编辑此答案以提供更好的答案!

于 2013-10-16T02:05:27.177 回答
0
  1. 确保你已经通过javac编译了你的类

  2. 请使用类路径执行命令,例如

    java $CLASSPATH:. 我的编辑器

于 2013-10-16T02:05:52.510 回答