goto Considered Helpful
Friday, December 15th, 2006 11:57 am![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Save me Edsgar! I just wished I could use a
goto
statement in Java. My code's primary purpose is to take a bunch of fixed-width data and save it to another file in a tab-delimited format. I decided to add the ability to save the layout. If the layout file already exists, I prompt the user with a Yes/No/Cancel dialog to overwrite. If they cancel, I don't want to write anything (layout or data) and just return from the function. If they say no, I won't write the layout file, but I still need to write the data. If they say yes, or if the file didn't already exist, I write the layout file and then write the data. With a goto, I could break out of my if conditions and just write the data. But without the goto, my options are to set a status flag, write a function to prompt and write the layout, returning a boolean if it was canceled so I can refrain from writing data (probably the best solution), or the following solution: write a one-iteration for loop and break to a label, like so:
if (verifyInputFile() && verifyOutputFile()) {
if (StringUtilities.isNotEmpty(saveLayoutField.getText())) {
gotohack: for (int hack = 0; hack == 0; ++hack) {
File layoutFile = new File(saveLayoutField.getText());
if (layoutFile.isDirectory()) {
layoutFile = new File(layoutFile, viewLinker.getInputFile().getName() + ".layout.txt");
}
if (layoutFile.exists()) {
int choice = OptionDialog.showStandardYesNoCancelDialog(parent, "Layout file " + layoutFile + " exists. Overwrite?");
if (choice == OptionDialog.CANCEL) {
return;
}
if (choice == OptionDialog.NO) {
break gotohack; // because Java can't goto the run call
}
}
try {
PrintWriter writer = new PrintWriter(new FileOutputStream(layoutFile));
for (Iterator iter = fieldModel.iterator(); iter.hasNext();) {
Field field = (Field) iter.next();
writer.println(field.name + "\t" + field.length);
}
writer.close();
} catch (Exception e) {
parent.handleException("Could not write layout file " + layoutFile, e);
}
}
}
writeData();
}