Gregory,
Sorry I response so late. I just back from a long vacation and it took
me longer time than I expected to catch up the mailing list (after all,
it's very active!). Please see my comments below.
Gregory Shimansky wrote:
Hello Paulex
I have a question about this problem. Do you know how exception in
finalizer
method affects the finalizer thread that it becomes suspended? I thought
that when calling finalize method the code should catch all exceptions
thrown by it and ignore them. AFAIK that's how finalizers are
implemented in
DRLVM. It specification it is written that
First of all, I think this issue should not happen if the spec of
FileInputStream/OutputStream doesn't require the implementation to
invoke close() in finalize() method, IMHO, generally it's not good
practice to depend on finalize(), and I guess this spec is inherited
from very early version, say, JDK 1.0, when the channel hasn't been not
introduced.
And actually I don't know exactly what happened to the finalizer thread
when the NullPointerException thrown, because, as you know, the Harmony
VME provided by IBM is only binary. What I saw is that the debugger
sometimes stops on the suspending finalizer thread at the
FileInputStream/OutputStream's close(), and the message shows that
"NullPointerException caused suspending"(maybe not exact words, but very
similar). So I tried to fix this problem in Java codes.
And I'd glad to have a try on DRLVM later, but anyway, I think it is
not bad idea to make our classlib codes more defensive and reliable.
your ideas?
"If an uncaught exception is thrown by the finalize method, the
exception is
ignored and finalization of that object terminates."
2006/5/19, Paulex Yang (JIRA) <[EMAIL PROTECTED]>:
java.io.FileInputStream and FileOutputStream might cause Finalizer
thread
suspending
------------------------------------------------------------------------------------
Key: HARMONY-479
URL: http://issues.apache.org/jira/browse/HARMONY-479
Project: Harmony
Type: Bug
Components: Classlib
Reporter: Paulex Yang
If one FileInputStream instance is not constructed properly, say, the
given file doesn't exist, the constructor will throw exception but the
FileInputStream instance is still necessary to be garbage collected,
and the
spec of FileInputStream's finalize() method requires that close()
must be
invoked, but the current implementation of FileInputStream.close()(as
below) will causes NullPointerException in Finalizer thread because
channel
field has not been initialized yet.
public void close() throws IOException {
synchronized (channel) {
synchronized (this) {
if (channel.isOpen() && fd.descriptor >= 0) {
channel.close();
}
fd.descriptor = -1;
}
}
}
This issue applies to FileOutputStream, too. Test case below can
reproduce
this issue only in debugger, because it is not easy to get the handle of
Finalizer thread. Debugging the test case to the statement following the
System.gc(), the debugger will show that the Finalizer thread is
suspended
due to NullPointerException.
public class FileInputStreamTest {
public static void main(String[] args) throws Exception{
FileInputStream is = null;
try{
is = new FileInputStream(new File("nonexist"));
}catch(Exception e){
System.gc();
e.printStackTrace();
}
}
}
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira
--
Paulex Yang
China Software Development Lab
IBM
---------------------------------------------------------------------
Terms of use : http://incubator.apache.org/harmony/mailing.html
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]