try-with-resources and null resource
Rémi Forax
forax at univ-mlv.fr
Thu Jan 27 01:09:02 PST 2011
On 01/26/2011 07:05 PM, Tim Peierls wrote:
> On Wed, Jan 26, 2011 at 8:58 AM, Rémi Forax <forax at univ-mlv.fr
> <mailto:forax at univ-mlv.fr>> wrote:
>
>> This code doesn't throw NPE when initializing r with null:
>>
>> R r = get();
>> try {
>> maybeUse(r);
>> } finally {
>> r.close();
>> }
>>
>> Nor should this code:
>>
>> try (
>> R r = get();
>> ) {
>> maybeUse(r);
>> }
>>
>> --tim
>
> Again, you're talking about implementation of the construct and
> not semantics of the construct.
>
>
> No, I am writing about what I think the semantics of the construct
> should be. I'm drawing an analogy between two constructs, one old, one
> new, that many users will see as similar, rightly or wrongly. Their
> expectations for the new construct's semantics will be shaped by this
> perception. I claim that most users won't expect NPE to be thrown
> immediately if the initializer is null, and that they will expect NPE
> to be thrown on the first attempt to dereference a null. They'll
> expect this because that's what happens in the analogous case.
>
> You can say the analogy is false, you can say that people should
> approach this construct as being radically different from try-finally,
> you can even say that most people are sloppy thinkers. But you can't
> change how they think by wishing, and it would be wrong to design the
> feature without taking such people into account.
>
> (You could also claim that I'm wrong about how the average user will
> respond to this new feature. But it doesn't sound like you're trying
> to make that case.)
>
> Perhaps it's because try-with-resources reuses the same keyword as
> try/finally, which doesn't help.
>
>
> To the contrary, I think this re-use of the try keyword will be very
> helpful to users trying to understand the new construct.
>
> I don't think most people will think about the new feature as being
> similar to things like switch or enhanced for. Switch takes an
> expression, and enhanced for uses a colon rather than equals, and thus
> doesn't look like a regular declaration. (If anything, they'll see a
> connection between t-w-r and the initialization clause of a
> traditional for loop.)
>
> To make things crystal-clear, what should you [sic] be the
> semantics of:
> using(R r = get()) {
> maybeUse(r);
> }
> if get() returns null?
>
>
> I think you're asking whether the users' expectations would be
> different if the construct used a different keyword. My answer: Maybe,
> but how is this relevant? People won't be thinking about alternative
> design choices when attempting to understand how the feature behaves.
>
> It is crystal clear that if you were designing this language feature
> you'd do it differently! :-)
>
> --tim
Tim,
try-with-resources is different from try/finally (not radically I agree)
because try-with-resources encompass
the declaration of the variable.
try-with-resource not only manage the resource but also the variable; by
example it declare it final implicitly;
storing the resource.
That's why I think try-with-resources should throw a NPE when trying to
assign a non existing (null) resource
to the variable it manage.
Rémi
More information about the coin-dev
mailing list