2013-10-16 2 views
1

Я работаю над проектом текстового редактора прямо сейчас для моего класса программирования, и я получаю сообщение об ошибке, которое я никогда раньше не видел, когда пытаюсь запустить его. Это довольно длинное объяснение, но в основном я использую класс редактора, который использует несколько других классов для создания связанного списка, хранения текстового файла в нем и последующего разрешения на изменение файла. Я должен запустить его в среде linux, и указанный файл должен быть введен как аргумент командной строки. Тем не менее, каждый раз, когда я пытаюсь запустить его, я получаю следующее сообщение об ошибкеПроблема ClassNotFoundException; связанная с 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()); 
     } 

    } 
} 

Очевидно, что есть нагрузка других классов, которые я использовал с этим, но Мне кажется, что ошибка в них не лежит. Есть ли у кого-нибудь опыт подобной ошибки?

EDIT: Я почти забыл упомянуть, по аргументу командной строки, я имел в виду, что файл, который должен быть обработан, уже должен находиться в каталоге linux, где он был помещен. По-видимому, это должно занять args [0]

+0

В какой системе вы находитесь? Как вы пытаетесь запустить этот класс? Вы знакомы с «терминальным окном» в вашей системе? – arcy

ответ

0
  1. Убедитесь, что вы собрали свой класс по JAVAC

  2. Пожалуйста, выполните команду с таким, как путь к классам

    Java $ CLASSPATH :. MyEditor

+0

Да, похоже, это была проблема ... Большое спасибо. Вы так привыкли к тому, что IDE делает это за вас, вы забываете, что в Linux его сначала нужно скомпилировать вручную. Кажется, сейчас работает. Спасибо за помощь! – Vincents

0

Ошибка говорит, что он не может найти класс myEditor во время выполнения, однако он присутствовал во время компиляции. В моих тестах, когда я запускал класс, и я что-то пропускал, он дал бы мне эту точную ошибку. Все ли ваши классы в одном и том же месте (или правильно организованы)? Попробуйте просмотреть все файлы .class, которые вам нужны, и убедитесь, что они все есть. Если вы предоставите более подробную информацию о том, как вы компилируете и запускаете это, я могу отредактировать этот ответ, чтобы дать вам лучший вариант!

2

java.lang.ClassNotFoundException поставляется в следующих случаях:

1) Когда мы пытаемся загрузить класс с помощью Class.forName() и .class файл или двоичный код класса не доступен в classpath.

2) Когда Classloader пытается загрузить класс с помощью метода findSystemClass().

3) При использовании метода loadClass() класса ClassLoader в Java.

Таким образом, ясно, что jvm не может найти ваш класс. Теперь вопрос в том, кто скажет jvm, где искать класс? Ответ - переменная среды CLASSPATH.

потому что Classpath - это набор параметров либо в командной строке, либо через переменную окружения, которая сообщает виртуальной машине Java или компилятору Java, где искать пользовательские классы и пакеты.

Таким образом, вы можете установить CLASSPATH во время выполнения "java $CLASSPATH:. myEditor" или в среде, как всегда, искать свой текущий каталог, и это устранит проблему.

В варианте с linux вы можете установить это в файле .bashrc (если используете bash), можете использовать команду set, можете установить в .bash_profile.В Windows вы найдете то же самое в «Системе -> Свойства»

Смежные вопросы