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) <jira@apache.org>:
>>
>> 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: harmony-dev-unsubscribe@incubator.apache.org
For additional commands, e-mail: harmony-dev-help@incubator.apache.org
|