Re: Trying to Understand Purpose of a Catch Block for IOException in
the Presence of One for FileNotFound
On Aug 12, 9:57 am, markspace <-@.> wrote:
On 8/12/2011 8:39 AM, KevinSimonson wrote:
I would appreciate any information anyone can give me on this.
I'm with Knute here: tl;dr, Show us the code!
I've actually written a number of different programs trying to find
something that I can run that will throw an exception that is a
<IOException> but not a <FileNotFoundException>. I've tried to open a
file for input when I don't have read access to the file. I've tried
to open a file for output when the file exists and I don't have write
access to the file. I've opened a file for input, done a "chmod u-r
<filename>" while the program's running, and then tried to close the
file. I've opened a file for output, done a "chmod u-w <filename>"
while the program's running, and then tried to close the file. Do any
of you want me to dig up some of those files?
Most recently I tried writing a Java program that opens a file but
then closes it without writing anything to it, that results in an
empty file, and then opens the same file and tries to read a line from
it. But that results in a <NoSuchElementException> getting thrown,
not an <IOException>. I don't think that file will help anyone.
Perhaps the best bet would be one I wrote back on 8 August:
import java.io.IOException;
import java.io.FileNotFoundException;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileWriter;
import java.io.BufferedWriter;
import java.io.PrintWriter;
import java.util.Scanner;
public class Cf
{
private static void prompt ( BufferedReader userInput
, String prmpt)
{
System.out.print( prmpt + "? ");
try
{ userInput.readLine();
}
catch (IOException excptn)
{
}
}
public static void main ( String[] arguments)
{
if (arguments.length == 2)
{ int lineCount = 0;
boolean srcOpnd = false;
try
{ BufferedReader usrInpt
= new BufferedReader( new
InputStreamReader( System.in));
prompt( usrInpt, "Construct source");
Scanner source = new Scanner( new File( arguments[ 0]));
srcOpnd = true;
prompt( usrInpt, "Construct destination");
PrintWriter dstntn
= new PrintWriter
( new BufferedWriter( new
FileWriter( arguments[ 1])));
String textLine;
for (;;)
{ prompt( usrInpt, "Call <hasNextLine()>");
if (! source.hasNextLine())
{ break;
}
prompt( usrInpt, "Read line");
textLine = source.nextLine();
prompt( usrInpt, "Write line");
dstntn.println( textLine);
lineCount++;
}
prompt( usrInpt, "Close files");
dstntn.close();
source.close();
prompt( usrInpt, "All done");
}
catch (FileNotFoundException excptn)
{ System.out.println();
System.out.println( "Couldn't open file!");
System.out.println( "<srcOpnd> == " + srcOpnd + '.');
}
catch (IOException excptn)
{ System.out.println();
System.out.println( "I/O problem with file!");
System.out.println( "<srcOpnd> == " + srcOpnd + '.');
}
}
else
{ System.out.println( "Usage is\n java Cf <source>
<destination>");
}
}
}
Functionally, it copies the contents of a file to another file, but it
stops at every significant part of the process and prompts for user
input. It doesn't _require any information_ from the user; all the
user has to do is hit the <Enter> key; all it does is let the user
delay execution of certain parts of the program until s/he has changed
permissions on the original file or the copy if s/he chooses to do so.
So try running this program and doing various things to the two
files. If you can find something that actually generates a
<IOException>, please, _please_, let me know what you did!
Kevin Simonson