このページで解決しない高度なJavaのシステム障害はJaTSにお任せください

Trouble 3: Javaプログラムが起動しません



<Q3-1>コンパイルが成功したにもかかわらず、実行時にメソッドの長さが長すぎるとエラーになってしまいます。

以下のエラーが発生します。

java.lang.ClassFormatError: test/TestClass (Code of a method longer than 65535 bytes)
   at java.lang.ClassLoader.defineClass0(Native Method)
   at java.lang.ClassLoader.defineClass(ClassLoader.java:486)
   at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:111)
   at java.net.URLClassLoader.defineClass(URLClassLoader.java:248)
   at java.net.URLClassLoader.access$100(URLClassLoader.java:56)
   at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
   at java.security.AccessController.doPrivileged(Native Method)
   at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
   at java.lang.ClassLoader.loadClass(ClassLoader.java:297)
   at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:286)
   at java.lang.ClassLoader.loadClass(ClassLoader.java:253)
   at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:313)
   Exception in thread "main" 

<発生環境>
OS any
JDK JDK1.3.1
Vender Sun
<A3-1>
エラー文の通り、メソッドの長さが長すぎるためにエラーとなっているので、メソッドの分割を行う必要があります。
Page Top

<Q3-2>あるクラスの定数を変更し、コンパイルしたところ、別のクラスから、修正を行っていないにも関わらず、実行時例外が発生するようになってしまいました。


<発生環境>
OS any
JDK any
Vender any
<A3-2>
finalを用いた定数は、コンパイル時に値へ変換されます。
クラスAのCONST_VAL=3をCONST_VAL=6としてクラスAのみを再コンパイルした場合、 値を参照しているクラスBからは、依然としてCONST_VAL=3として扱ってしまうことになります。
finalによる定数を変更する場合は、その定数を利用しているクラス全てを再コンパイルする必要があります。
Page Top

<Q3-3>「-classpath」と「-jar」オプションを併用し、それぞれ異なるjarファイルを指定して実行したところ、NoClassDefFoundErrorが発生しました。

クラスパスで指定していたクラス群を、otherlib.jarとしてまとめ、以下のように起動したのですが、otherlib.jarを読み込めずjava.lang.NoClassDefFoundErrorが発生しました。
なお、マニフェストファイルにてMain-Classの指定を正しく行っています。

java -classpath otherlib.jar -jar myprog.jar
※NoClassDefFoundErrorについての初心者向けのやさしい解説は、「初心者のためのJava講座」番外編3をご覧下さい。

<発生環境>
OS any
JDK any
Vender any
<A3-3>
Javaプログラムを-jar オプションで起動する際は、マニフェストファイルでClass-Pathエントリを設定する必要があります。
マニフェストファイルに以下のエントリを作成し、Jarファイルを作り直して下さい。 詳細はこちらを参照
  -------------------------------------
    Manifest-Version: 1.0
    Created-By: Ant 1.4.1
    Main-Class: test.jar.MainClass
    Class-Path: otherlib.jar     ←この行を追加
  -------------------------------------
なお、-classpathは不要ですので、以下のように実行します。
    java -jar myprog.jar

Page Top

<Q3-4>2つ以上のFEPが存在する場合、VMの起動に失敗してしまいます。


<発生環境>
OS Win98se
JDK JRE1.3
Vender Sun
<A3-4>
MS-IMEとATOKの組み合わせの場合、ATOKのリビジョンパッチをあてることで解決できます。(ATOK12,13)
Page Top

<Q3-5>Win98環境でATOKを使用しているときにJavaAP起動時にVMでエラーが発生して起動しないのですが。

ATOK13について現象が発生しているのを確認しました。

<発生環境>
OS Win98OSR2
JDK JDK1.3.0
Vender Sun
<A3-5>
JUSTSYSTEMによると、Q5と同様に、ATOK12,13でこの現象が発生しているらしく、対処策としてはATOKのパッチをインストールしてください。
Page Top

<Q3-6>GUIのないプログラムなのにコンソールから実行するとAWT関連の例外が発生して実行できません。


<発生環境>
OS RedHatLinux6.1/6.2 Solaris7
JDK JDK1.3
Vender Sun/IBM
<A3-6>
javax.swing.Timerを使用していたことが原因です。java.util.Timerへ切り替えることで解決できます。これ以外に実行環境の設定(X-Windowの設定)を変更して対処することもできます。
Page Top

<Q3-7>クラスファイルは完全なのにClassFormatErrorが発生してしまいます。


<発生環境>
OS RedHatLinux6.2 SMP
JDK JDK1.3
Vender Sun
<A3-7>
未解決:RedHatLinux6.2のSMPカーネルのみで起こる現象のようです。
Page Top

<Q3-8>JDK1.4.1_01をインストールしたSolaris8でプログラムを実行したところ、正常に起動しませんでした。

コンソールに以下のエラーが出ました。

NoClassDefFoundError: sun.io.CharToByteJIS0208
(以下略)

<発生環境>
OS Solaris8
JDK JDK1.4.1
Vender Sun
<A3-8>
Solaris8に標準でインストールされているJDK(バージョンは1.3)にJDK1.4.1を上書きしてしまった為です。両バージョンとも、インストールディレクトリが/usr/j2seなので、JDK1.4.1を上書きインストール時するとJDK1.3のファイルが残り、この問題が発生します。

/usr/j2seディレクトリを削除し、再度JDK1.4.1をインストールすることで解決できます。インストール手順の詳細はJava 2 SDK インストールガイドを参照してください。
Page Top

<Q3-9>Java3Dを使用したプログラムがWindowsNT、Windows2000で動作しません。


<発生環境>
OS Windows2000/NT
JDK JDK1.3
Vender Sun
<A3-9>
Windows NT 4.0の場合、JDK 1.2.xのインストーラーはjava.exe, javaw.exeをC:\WINNT\SYSTEM32にインストールし、環境変数PATHの設定上、そちらが実行されるためです。PATHを変更してjdk1.3\binのjavaを実行するように変更することで解決できます。
Page Top

<Q3-10>Windows VistaでTomcatが動作しません。

Windows XPで動いていたTomcatをWindows Vistaで動かすと
以下のエラーが表示されて失敗します。

java.io.IOException: 元のファイル名を
 C:\Program Files\Apache Software Foundation\Tomcat 5.5
 \conf\tomcat-users.xml.oldに変更できません。

<発生環境>
OS Windows Vista
Tomcat 5
<A3-10>
Windows Vistaになって追加された機能、ユーザーアカウント制御(UAC)によって
Tomcatの動作(ファイルの操作)が制限されているためです。

UACはウィルスや不正な操作、操作ミスでOSの重要な機能が利用されてしまうのを
防ぐための機能です。
セキュリティを向上させるために必要な機能ですが、
Tomcatで必要なファイル操作やポート利用がUACで制限されるため、
Windows Vistaで動作しないのです。

UACはデフォルトで有効になっています。
これを回避するには2つの方法があります。

  1.プログラムを右クリックし「管理者として実行」を選択する
  2.UACをオフにする

2.の方法では以下の操作が必要です。

    a.管理者権限でログインする
    b.「コントロールパネル」⇒「ユーザーアカウント」に移動する。
    c.「ユーザーアカウント制御の有効化または無効化」をクリックして設定を変更する。
    d.UACのダイアログが表示されるため「続行」をクリックする。
    e.「ユーザーアカウント制御(UAC)を使ってコンピュータの保護に役立たせる」
        のチェックボックスを外す。
Page Top

<Q3-11>-XX:+HeapDumpOnOutOfMemoryErrorを指定すると、JVMが起動できません。

Javaのヒープダンプを取得するために、
オプションに"-XX:+HeapDumpOnOutOfMemoryError"を指定し、
アプリケーションを起動しましたが、
以下のエラーが発生し、プログラムが起動しません。

HeapDumpOnOutOfMemoryErrorについては、JTSメールマガジンを 参照してください。

Unrecognized VM option '+HeapDumpOnOutOfMemoryError'
Could not create the Java virtual machine.

<発生環境>
OS Any
JDK JDK5.0 update 6
Vender Sun
<A3-11>
オプション "+HeapDumpOnOutOfMemoryError" は、
JDK5.0u6までのJDK5.0ではサポートされていません。

そのため、オプションに"-XX:+HeapDumpOnOutOfMemoryError"を指定しても、
無効なオプションとみなされ、JavaVMが起動しません。


HeapDumpOnOutOfMemoryErrorは、以下のバージョンで利用できます。
Java1.4.2_12以降, Java5.0u7以降, Java6.0の全てのバージョンで利用することができます。

Page Top

注意:本文書の内容に誤りがあり、またこの文書によって不利益を被っても、
Acroquest Technology 株式会社は一切関知いたしません。

  • 現象別Index
  • 原因別Index

Find Bugsバグ詳細

Find Bugs Bug Descriptions日本語版

RSSで更新情報を取得する

RSSとは、ホームページの更新情報を配信する為のフォーマットです。
RSSを利用すると、登録したページの情報が更新された場合に、更新情報を自動的に受け取る事ができます。

詳細

弊社小森が執筆致しました

Javaでオブジェクト指向開発

Javaプログラミング言語習得において、新人プログラマーの最初の障害は「オブジェクト指向の壁」です。
本書は、Javaのソフトウェア開発を中心に事業を発展させてきたAcroquest社の新人教育セミナーを加筆・書籍化したもので、大卒の新人に対して、ゼロからJava言語を教えてきた実績をフィードバックしています。

メールマガジン配信中

Javaトラブルシューティングのメルマガをはじめました!是非ご購読ください

詳細