2011-09-09 15 views
9

방금 ​​Java를 배우기 시작했으며 적은 양의 코드 만 알고 있지만 아직 간단한 프로그램입니다. 그것은 장난 꾸러기 프로그램의 더 많은 것, 그러나 단지 jar 파일을 만들 수 있는지 테스트하는 것이 대부분입니다. 여기 .jar 파일을 실행하려고 할 때 NullPointerException이 발생했습니다.

코드입니다 : randommouse.java를 호출 된 파일하기 위해 나는이 저장

import java.awt.*; 
import java.awt.event.*; 
import java.lang.*; 
import java.util.Random; 
public class randommouse { 
    public static void main(String[] args) { 
     for (int i=1; i<1000; i++) { 
      Random rand = new Random(); 
      int w = rand.nextInt(1024) + 1; 
      int h = rand.nextInt(768) + 1; 
      int t = rand.nextInt(2000) + 1; 
      try { 
       Robot r = new Robot(); 
       r.mouseMove(w,h); 
       Thread.sleep(t); 
      } catch (AWTException e) {} 
      catch (InterruptedException e) {} 
      catch (NullPointerException e) {} 
     } 
    } 
} 

, 는이 작동

javac randommouse.java 

사용하여 컴파일하고 내가 실행할 때 그것은

java randommouse 
를 사용하여

잘 작동합니다.

그러면 jar 파일을 만들려고합니다. 나는이 명령을 사용한다.

jar cvf randommouse.jar randommouse.class 

그리고 그것은 작동한다. 그런 다음 jar 파일을 두 번 클릭하면 오류 Java Exception이 발생합니다.
그래서 그때

java -jar randommouse.jar 

로 cmd를 실행하고

F:\Java>java -jar randommouse.jar 
Exception in thread "main" java.lang.NullPointerException 
     at sun.launcher.LauncherHelper.getMainClassFromJar(LauncherHelper.java:3 
99) 
     at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:463) 

F:\Java> 

내가 인수에 넣어해야합니까이 오류, 그렇다면 나는 것을 넣어 않는 곳에서 어떻게?


답변

9

the JDK doc에서이 옵션이 작동하기 위해서는

, JAR 파일의 매니페스트 양식

Main-Class: classname 
의 라인을 포함해야

여기, 클래스 이름 ide 응용 프로그램의 시작점 역할을하는 public static void main (String [] args) 메서드가있는 클래스를 정의합니다. Jar 파일 및 Jar 파일 매니페스트 작업에 대한 정보는 도구 참조 페이지 및 에 대한 Java 자습서의 Jar 추적을 참조하십시오.

이 옵션을 사용하면 JAR 파일은 모든 사용자 클래스의 원본이되며 다른 사용자 클래스 경로 설정은 무시됩니다.

3

당신은 진입 점을

$> echo "Main-Class: randommouse" > Manifest 
$> jar cfm randommouse.jar Manifest randommouse.class 
1

실제 문제와 관련이없는 코드와 문제의 부부를 설정해야하지만, 그럼에도 불구하고 중요하다.

1)이 문은 불필요 : 기본적으로

import java.lang.*; 

java.lang의 모든 클래스는 수입 암시입니다. 명시 적으로 할 필요는 없습니다. 그들은 지금까지 일어난 모든 증거을 버리고 당신으로 인해 프로그래밍 오류 가능성이 가장 높은 예외를 잡고있다

try { 
      // ... 
    } catch (AWTException e) { 
    } catch (InterruptedException e) { 
    } catch (NullPointerException e) { 
    } 

:

2)이 위험 나쁜 코드입니다. 적어도, 어떤 종류의 에러 메시지를 출력해야하고 예외를 진단 할 수있는 stacktrace를 출력해야합니다.

(A main 방법)이 특정 상황에서

다음은 더 나은 방법입니다 :

try { 
      // ... 
    } catch (Throwable e) { 
     System.err.println("An unexpected error has occurred:"); 
     e.printStacktrace(System.err); 
     System.exit(1); 
    } 
1

내가 클래스의 소스 코드를 확인해 보니 메인 클래스를 얻으려고 보인다 속성을 문자열 목록 인 속성 목록에서 찾은 다음 발견 된 기본 클래스 속성에 대해 trim() 메소드를 호출합니다. 주 클래스가 지정되지 않으면 주 클래스 속성이 없으므로 검색 메소드가 null을 반환하여 null을 반환하고 trim()이 호출 될 때 검색 메소드가 반환되었으므로 NullPointerException이 발생합니다 없는.

[directory of class files]>jar -cvmf [name of manifest] MyApp.jar

을 그리고 당신은 (마지막에 줄 바꿈 포함) 매니페스트 권리를 작성했는지 확인하십시오 :이 문제를 방지하려면, 메인 클래스는 단지 매니페스트에 지정되어 있는지 확인

Main-Class: [name of main class] 
관련 문제