Re: How to catch everything?
aaronfude@gmail.com wrote:
...
I have this code:
This code I would call a 'snippet'. Please consider posting
compilable code in future, as it makes it much simpler for
people to help. By 'compilable', I specifically mean an
SSCCE.
Nevertheless, I would suggest a variety of changes to this
snippet, partly based on misunderstandings observed in
the thread, and partly on making it closer to an SSCCE.
public static Universe gLoadUniverse(String uvName) {
Huhh? A frickin' 'Universe'?! Try loading a Galaxy, Nebula,
Stellar System, Planet, Moon or even a plain ol' Java
*Object* successfully, before worrying about loading
one (or more) Universe's!
try {
System.out.println("I'm here");
Where's 'here'? On my box, running in Sun's JRE,
in a typical situation, that would be the 'command line'
where that string appears for me. It means little more..
OTOH
System.out.println("Start of try");
..means a little more.
ObjectInputStream ois = new ObjectInputStream(new
FileInputStream("C:/a.obj"));
System.out.println("I'm here");
And this? An identical string? Counting Strings to
find the location in the source is an horrendous idea.
I suggest instead..
System.out.println("ois: " + ois);
which is not only an unique (so far) and specific string,
but also gives us some information on that OIS. For
example, is OIS 'null'?
But I will take it further.
Code that is broken, should do only *one* thing at a
time, and it should check *each* step. This is how I
might write those two lines.
// ObjectInputStream ois = new ObjectInputStream(new
// FileInputStream("C:/a.obj"));
// TOO BIG A CHUNK!
File drive = new File( "C:" );
System.out.println("drive: " + drive + " \texists: " + drive.exists() );
// uses the correct path separator for OS
File file = new File( drive, "a.obj" );
System.out.println("file: " + file + " \texists: " + file.exists() );
FileInputStream fis = new FileInputStream(file);
System.out.println("fis: " + fis );
ObjectInputStream ois = new ObjectInputStream(fis);
System.out.println("ois: " + ois);
..obviously this would not be the way to write production
code, but this is experimental code where we are trying
to figure what is going wrong, so the extra lines/effort
make sense.
Of course, logging would be a better way to get output
at this level, and I am almost surprised that Lew has
not already taken the opportunity to extoll its virtues. ;-)
...
catch (Exception e) {
..As Patricia(?) and others have pointed out, that
does not cover Errors.
System.out.println("I'm here " + e.getMessage());
e.printStackTrace();
This is good strategy, and should usually get
the goods on what went wrong, assuming the
problem is caught, but it makes the previous line
somewhat redundant..
return null;
}
}
It prints out the first to I'm here's, but nothing else.and quits.
That seems to be beyond the point to which I
was explaining, but both recode the code in the
early part, and carry that principle through to any
other code before proceeding (I recommend).
...So
in "Universe uv = (Universe) ois.readObject();" something goes wrong,
but I don't get any feedback whatsoever.
That seems very odd, unless other code, not shown*,
is swallowing exceptions or errors - not printing them.
...Is there something else that
I may not be catching?
Error, but I don't think that, in itself, explains the
behaviour you are *not* seeing (some error output,
if nothing else). This brings me back to..
* An SSCCE that demonstrates the behaviour.
Preferably one with a 'path' String fed in main()
(that can be easily found and changed), that first
writes a simple Object, then reads it back in.
--
Andrew Thompson
http://www.athompson.info/andrew/
Message posted via http://www.javakb.com