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]

Reply via email to