0

FileWriterにラップされたBufferedWriterを使用する私のプログラムは、実行するたびに特定の場所で終了し続けます。私は一生の間、その理由を理解することはできません。

以下は私のコードです。私はメモリリークについて考えましたが、それは例外をスローすると確信しています(もちろん、それが表示されないようにした場合を除きます)。そして、それがエラーをスローすることになっている場合、どうすればそれを解決できますか?ありがとう

import java.io.*;

public class BuffProcess {

static BufferedReader brOne, brTwo;
static FileReader inOne, inTwo;
//static FileInputStream fOne, fTwo;
static FileWriter out;
static BufferedWriter bw;
static StringBuffer sbOne, sbTwo;
static String stOne, stTwo, tech;
static char cOne, cTwo;
static boolean bOne, bTwo;
static int count, intOne, intTwo, intThree, intFour, intFive, intSix, maxSet, lineCount;
static int pCount, check;

public static void p(String s) {

    try {
        inOne = new FileReader(s + ".ck2");
        inTwo = new FileReader(s + ".ck2");
        brOne = new BufferedReader(inOne);
        brTwo = new BufferedReader(inTwo);
        out = new FileWriter(s + "_edit.ck2");
        bw = new BufferedWriter(out);
    } catch (FileNotFoundException e) {
        System.out.println("FileNotFoundException");
    } catch (IOException e) {
        System.out.println("IOException");
    }

    stOne = "Start";
    stTwo = "Start";
    tech = "Pants";
    bOne = true;
    bTwo = false;
    count = 0;
    pCount = 929;

    try {

        while (stOne != null) { //For entire file
            lineCount++;
            //print("Lines processed=" + lineCount);
            stOne = brOne.readLine();
            brTwo.readLine();
            bw.write(stOne); bw.newLine();

            // Find settlements area of file
            if (stOne.contains("name=\"Vestisland\"")) { //Vestisland action (settlements section)

                for (int i = 2; i > 0; i--) {
                    stOne = brOne.readLine();
                    brTwo.readLine();
                    bw.write(stOne); bw.newLine();

                }

                stOne = brOne.readLine();
                brTwo.readLine();

                if (stOne.contains("max_settlements=")) {//For Vestisland only

                    while (bOne) { //Find tech levels
                        stTwo = brTwo.readLine();
                        count++;

                        if (stTwo.contains("technology=")) {

                            for (int i = 4; i > 0; i--) {
                                stTwo = brTwo.readLine();
                                count++;
                            }
                            tech = stTwo;
                            bOne = false;
                        }
                    }
                    bOne = true;
                    maxSet();
                    bw.write(maxSetBlank + maxSet + "\n"); bw.newLine();
                    pCount--;
                    //print("Number of provinces remaining=" + pCount);
                    //print("Number of provinces done=" + (929 - pCount));
                    print("Vestisland" + ++check);

                    while (count !=0) {
                        brOne.readLine();

                        count--;
                    }
                }
                bw.flush();
                out.flush();

                while (pCount > 0) {// For provinces section
                    stOne = brOne.readLine();
                    //print(stOne);
                    brTwo.readLine();
                    bw.write(stOne); bw.newLine();

                    if (stOne.contains("name=")) {
                        names:
                        switch (stOne) {

                        case nullOne: case nullTwo: case nullThree: case nullFour: case nullFive:
                            print(test + "null");
                            pCount--;
                            //print("Number of provinces remaining=" + pCount);
                            //print("Number of provinces done=" + (929 - pCount));
                            print("Desert" + ++check);
                            break names;

                        default:

                            for (int i = 2; i > 0; i--) {
                                stOne = brOne.readLine();
                                brTwo.readLine();
                                bw.write(stOne); bw.newLine();
                            }

                            stOne = brOne.readLine(); print(stOne);
                            brTwo.readLine();

                            if (!stOne.contains("max_settlements")) {

                                while (bOne) { //Find tech levels
                                    stTwo = brTwo.readLine();
                                    count++;

                                    if (stTwo.contains("technology=")) {

                                        for (int i = 4; i > 0; i--) {
                                            stTwo = brTwo.readLine();
                                            count++;
                                        }
                                        tech = stTwo;
                                        bOne = false;
                                    }
                                } //Find tech levels
                                bOne = true;
                                maxSet();
                                bw.write(maxSetBlank + maxSet + "\n"); bw.newLine();
                                bw.write(stOne); bw.newLine();
                                pCount--;
                                //print("Number of provinces remaining=" + pCount);
                                //print("Number of provinces done=" + (929 - pCount));
                                print("Without max_settlements" + ++check);
                            } else {

                                while (bOne) { //Find tech levels
                                    stTwo = brTwo.readLine();
                                    //print(stTwo);
                                    count++;

                                    if (stTwo.contains("technology=")) {

                                        for (int i = 4; i > 0; i--) {
                                            stTwo = brTwo.readLine();
                                            //print(stTwo);
                                            count++;
                                        }
                                        tech = stTwo;
                                        bOne = false;
                                    }
                                }
                                bOne = true;
                                maxSet();
                                bw.write(maxSetBlank + maxSet + "\n"); bw.newLine();
                                pCount--;
                                //print("Number of provinces remaining=" + pCount);
                                //print("Number of provinces done=" + (929 - pCount));
                                print("With max_settlements" + ++check);
                            }
                            break names;
                        }
                }

            } //While provinces remain

                try {
                    while (stOne != null) {
                        bw.write(brOne.readLine()); bw.newLine();
                    }
                } catch (NullPointerException e) {
                    stOne = null;
                }

        }
        }
    } catch (IOException e) {
        System.out.println("IOException");
    } catch (NullPointerException e) {

    } finally {
        try { bw.close(); } catch (IOException e) {
            System.out.println("IOException");
        } finally { }
    }
    System.out.println("Provinces=" + pCount);
}

private static void maxSet() {
    int avg;
    intOne = Integer.parseInt(tech.substring(16, 17));
    intTwo = Integer.parseInt(tech.substring(18, 19));
    intThree = Integer.parseInt(tech.substring(22, 23));
    intFour = Integer.parseInt(tech.substring(24, 25));
    intFive = Integer.parseInt(tech.substring(30, 31));
    intSix = Integer.parseInt(tech.substring(46, 47));
    avg = Math.round((intOne+intTwo+intThree+intFour+intFive+intSix)/6);
    maxSet = avg + 2;
    //print(maxSet);
}

private static void print(Object o) {
    System.out.println(o);
}

static int pCheck = 0;
static String test = "This line is reached";
static final String maxSetBlank = "\t\tmax_settlements=";
static final String nullOne = "\t\tname=\"Western Sahara\"\n";
static final String nullTwo = "\t\tname=\"Adrar Plateau\"\n";
static final String nullThree = "\t\tname=\"Siberia\"\n";
static final String nullFour = "\t\tname=\"Sahara Desert\"\n";
static final String nullFive = "\t\tname=\"Sharawrah\"\n";

}

4

3 に答える 3

3

あなたが無視している NullPointerException をスローしていると思われます。

すべての例外キャッチを削除し、メソッドにthrowsこれらの例外を許可することをお勧めします。例外をキャッチする価値があるのは、それらを使って何か役に立つことをしようとしている場合だけです。

ところで:あなたのフィールドはどれも静的である必要はないと思います。可能であれば、ローカル変数を作成します。

于 2013-01-31T18:00:43.157 に答える
0

一番下にあるキャッチ NullPointerException は何も出力していません。

アドバイス... Eclipse のように、エラーを自動的にログに記録する IDE を使用してください。それはあなたの人生を約10億倍楽にします。

于 2013-01-31T18:08:14.497 に答える
0

まず、catch ブロックのスタック トレースを出力します。たとえば、replace

} catch (IOException e) {
    System.out.println("IOException");
}

} catch (IOException e) {
    e.printStackTrace();
}

また、例外を再スローまたはログに記録せずに例外をキャッチしないようにします。デバッグ中に現在直面している問題は、その結果です。

ところで、ある時点で例外を処理する方法がわからない場合は、それをキャッチしないでください。たとえば、IOException通常、キャッチして無視するべきではありません。

NullpointerExceptionまた、 、IllegalStateExceptionIllegalArgumentExceptionまたはのような論理エラーをキャッチしないでくださいAssertionError。これらはほとんどの場合、プログラミングの間違いです。それらを捕まえて無視すると、問題は隠されますが、解決にはなりません。

于 2013-01-31T18:22:28.743 に答える