2013-10-16 35 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()); 
     } 

    } 
} 

顯然,有我這個人用其他類的負載,但它在我看來,錯誤並不在於他們。有沒有人有這種錯誤的經驗?

編輯:我幾乎忘記提及,通過命令行參數,我的意思是這個文件應該與之合作應該已經放在它放在它的linux目錄中了。它顯然應該佔用參數[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)在Java中使用類ClassLoader的loadClass()方法。

所以很明顯,jvm無法找到你的班級。現在問題是誰會告訴jvm在哪裏尋找課程?答案是 - CLASSPATH環境變量。

因爲Classpath是命令行上的參數集或通過環境變量告訴Java虛擬機或Java編譯器在哪裏查找用戶定義的類和包。

因此,您可以在運行時設置CLASSPATH "java $CLASSPATH:. myEditor"或在環境中一如既往地查找當前目錄,它將解決問題。

在linux上,你可以在.bashrc文件中設置(如果使用bash),可以使用set命令,可以設置爲.bash_profile。在Windows上,你會發現在「系統 - >屬性」