これは長くなり、かなり具体的になったので、質問を明確にするために数行を挿入することをお勧めします。なぜこれが他の人にとって役立つのか. これが私の最初の質問であることを覚えておいてください。情報が少なすぎたり多すぎたりする場合は、お知らせください。
私が尋ねたい質問は次のとおりです。
ライブラリ コードの変更やセキュリティ パッチにより、Java のさまざまなバージョンで期待どおりに動作しなくなる Java の部分はありますか? これが私の問題に当てはまるかどうかを判断できますか?
この情報は、他のプログラミング初心者にとって、Java 言語が新しいバージョンに進化するときに起こる変化をよりよく理解するのに役立つと信じています。このサイトで、Java のバージョンが 1.5 からバージョン 1.6 および 1.7 ( JDK 1.6 および 1.7 の新機能) に変更されたことに関する質問を見つけましたが、コードが機能しない理由を特定できませんでした。ちゃんと。
コマンド ライン リクエストを実行するために、Runtime オブジェクトを使用して Windows システムから値を取得できるプログラムを作成しました。取得される情報は、主にレジストリ キーの値です。この情報を取得した後、プログラムで File オブジェクトを作成し、取得した情報を作成する HTML ファイルに出力します。それぞれのバージョン (1.5 および 1.7) で実行可能な JAR ファイルを作成して実行できます。ただし、1.7 システムで 1.5 JAR を実行すると、結果の HTML は作成されますが、空白のままになります。動作を停止するプログラムの別の部分は、そのデバッグ オプションです。JAR と同じディレクトリにある debug.txt というファイルを探すデバッグ オプションを作成しました。ただし、1.5 バージョンは 1.7 でデバッグ オプションを有効にしません。
編集
問題の概要:
私のプログラムは、システムから取得した情報から HTML ファイルを作成する必要があります。現時点では、1.5 のコンパイル済みバージョンを Java バージョン 1.7 で実行すると、情報が入った HTML ファイルではなく、空の HTML ファイルが作成されるだけです。もう 1 つの変更点は、プログラムが通常、最初のコード セグメントの catch ブロックで見られるように作成された文字列を含むデバッグ ログ ファイルを生成することです。これは、ファイル debug.txt が存在する場合に実行する必要がありますが、存在しません。
編集
私はこの問題を調査し、Java が後方互換性を意図していることを知りました。バージョンの問題を示している可能性のある問題を見つけることができませんでした。バージョン間で適用すると、コードに問題がある可能性が高いと思います。
期待どおりに動作しないセクションにいくつかのコードを含めました。
try{
File file = new File("C:\\Users\\" + System.getProperty("user.name") + "\\Desktop\\Results.html");
FileWriter outFile = new FileWriter(file);
PrintWriter out = new PrintWriter(outFile);
out.println("A large" + amount + "of concatenated" + strings);
out.flush();
out.close();
}catch(IOException e){
//debugErrorString currently has global scope
debugErrorString += ("*************************************************************\r\n" +
"There was an issue with writting the results.html document" + e +
"\r\n**********************************************************\r\n\r\n\r\n\r\n");
}
public static void writeDebugLog(){
try{
final String debugLogFile = "C:\\Users\\" + System.getProperty("user.name") +
"\\Documents\\WorkstationDebugLogFile.txt";
PrintWriter out = new PrintWriter(new FileWriter(debugLogFile));
//registry currently has global scope
out.println(debugErrorString + "\n\n\n" + registry.getDebugString() + "\r\n");
out.flush();
out.close();
}catch(Exception e){
System.out.println(e);
}
}
追加情報:
- このコードは、Eclipse を使用して記述、コーディング、コンパイル、および JAR ファイルへのパッケージ化が行われました。
- テストは 2 つの Windows 7 x64 システムで実行されました
- オペレーティング システムに固有のコードを作成することは、Java の目標に反することを認識しています。
- このプログラムが情報を取得するアプリケーションは、Windows オペレーティング システムのみを使用します。
- Windows レジストリからの情報も必要です。これをどのように行い、Java のクロスプラットフォーム機能を維持するかはわかりません。
- Eclipse がマニフェスト ファイルを自動的に生成できるようにしました。
- 私はJavaプログラムの作成に比較的慣れていません。
このサイトのコーディングや質問の書き方に関する問題に対処するのに役立つ コメントをいただければ幸いです。
この情報と私の質問を確認していただき、ありがとうございます。
編集
提案から得られた追加情報。
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
Caused by: java.lang.StringIndexOutOfBoundsException: String index out of range:-1
at java.lang.String.substring(String.java:1958)
at com.McKesson.WorkstationDiagnostic.WorkstationDiagnostic.createPage(WorkstationDiagnostic.java:321)
at com.McKesson.WorkstationDiagnostic.WorkstationDiagnostic.main(WorkstationDiagnostic.java:125)
... 5 more
問題の行は次のとおりです。
if(new File(envVar.substring(envVar.indexOf("C:\\oracle\\product\\"), envVar.indexOf("\\bin;C:\\") + 4)).exists())
バージョンをまたぐ場合にのみ部分文字列が見つからない理由は定かではありませんが、ここで確認する必要があります。この部分文字列が見つからず、検索された文字列の制限を超えていることに対処する必要があります。また、バージョンを越えたときにこの問題が発生した理由を特定する必要があります。
これにより、元の質問にも戻ります。新しいバージョンで実行する場合にのみ、このようなものが機能しないのはなぜですか?
編集
編集
コメントに基づいて、次の変更を加えました。
if(new File(envVar.substring(envVar.indexOf("C:\\oracle\\product\\"), envVar.indexOf("\\bin;C:\\") + 4)).exists())
に変更されました
String tokens [] = envVar.split(";");
for(int i = 0; i < tokens.length; i++)
if(tokens[i].contains("C:\\Oracle\\Product") && new File(tokens[i]).exists())
これにより、見られた配列インデックス エラーがスローされる可能性も排除されます。また、1回目のテストが偽の場合、2回目のテストは行われないと考えています。
この行で到達しようとしていた目標は、環境変数に Oracle bin ディレクトリの実際の場所が含まれていることを確認することでした。
私の解決策を改善するための提案がある場合は、お知らせください。
編集