我的程序使用包裹在 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";
}