我正在为我的编程类正在编写一个文本编辑器项目,并且当我尝试运行它时,我遇到了一个我从未见过的错误。这是一个相当长的解释,但基本上,我使用的编辑器类使用其他几个类来创建链表,在其中存储文本文件,然后允许修改文件。我应该在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]答案 0 :(得分: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上,您可以在“系统 - &gt;属性”
中找到相同的内容答案 1 :(得分:0)
错误是说它无法在运行时找到类myEditor 但是在编译时出现了。在我的测试中,当我运行课程并且我遗漏了某些内容时,它会给我一个确切的错误。您的所有课程都在同一个地方(或组织得当)吗?尝试查看所需的所有.class文件,并确保它们都在那里。如果您提供有关如何编译和运行此内容的更多详细信息,我可以编辑此答案以便为您提供更好的答案!
答案 2 :(得分:0)
确保您已通过 javac
请使用类路径执行命令,例如
java $ CLASSPATH:的MyEditor