On Wed, 8 May 2024 19:40:44 GMT, Stuart Marks <sma...@openjdk.org> wrote:

>>> Most of these are defined in terms of `String.valueOf(Object)` which if 
>>> passed a null reference will return the String object containing `null`. So 
>>> no, I don't think NPE should be thrown. It might be worth mentioning this 
>>> explicitly somewhere though.
>> 
>> Right, in our current model, `Console.readln(prompt)` can be reduced to 
>> `Console.print(prompt)` followed by actual reading. `Console.print(prompt)` 
>> can in turn be reduced to printing the result of `String.valueOf((Object) 
>> prompt)`, which is a string "null".
>> 
>> The above reduction means that `Console.readln(null)` will not throw NPE. 
>> Now, what I'm asking if that's what we really want.
>> 
>> With `Console.println(null)` and `Console.print(null)` not throwing NPE 
>> makes sense. However, with `Console.readln(null)` it might not. After all, 
>> we ask for a **`String`** prompt, not an `Object` prompt. All other methods 
>> of `Console` that accept `String`, throw NPE if that string is null.
>> 
>> One more consideration. Whatever the behaviour we choose for 
>> `Console.readln(null)`, we should choose the same behaviour for 
>> `IO.readln(null)`. Otherwise, it would be a constant source of unpleasantly 
>> surprising inconsistency.
>> 
>> Thoughts?
>
> A fair question, whether to treat `readln` differently because it takes a 
> String argument instead of an Object.
> 
> I guess I'd like to see a scheme like the following:
> 
>     String s = cons.readln(prompt);
> 
> is effectively the same as
> 
>     cons.print(prompt);
>     cons.flush();
>     String s = cons.readLine(); // note no-arg readLine() method
> 
> In other words, define `readln` to behave "as if" the other methods were 
> called. This would end up with a null prompt argument printing "null" and not 
> throwing NPE.
> 
> This is internally consistent, at least. Beginning programmers will 
> eventually learn that using null will lead to NPE. It might make things 
> easier if NPEs were kept out of this little corner of the library. That's 
> just my guess though.
> 
> Also, recall that `String.valueOf((Object) null)` and 
> `String.valueOf((String) null)` both result in "null". But if one were to 
> write `String.valueOf(null)` that throws NPE, because that selects the 
> `valueOf(char[])` overload. That's kind of the outlier. Note further that the 
> built-in `+` string concatenation operator will also convert null references 
> to "null".
> 
> Personally I've always hated that string conversions of null in Java often 
> result in "null" but it's baked into the system fairly deeply, so I think we 
> should stick with it.

Okay, I'll push a commit soon.

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/19112#discussion_r1594784225

Reply via email to