<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
{font-family:Aptos;}
@font-face
{font-family:Consolas;
panose-1:2 11 6 9 2 2 4 3 2 4;}
@font-face
{font-family:"Noto Sans";}
@font-face
{font-family:inherit;
panose-1:0 0 0 0 0 0 0 0 0 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0cm;
font-size:12.0pt;
font-family:"Aptos",sans-serif;}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:blue;
text-decoration:underline;}
code
{mso-style-priority:99;
font-family:"Courier New";}
pre
{mso-style-priority:99;
mso-style-link:"HTML Preformatted Char";
margin:0cm;
margin-bottom:.0001pt;
font-size:10.0pt;
font-family:"Courier New";}
span.HTMLPreformattedChar
{mso-style-name:"HTML Preformatted Char";
mso-style-priority:99;
mso-style-link:"HTML Preformatted";
font-family:Consolas;
mso-ligatures:none;
mso-fareast-language:EN-CA;}
span.gmail-hljs-type
{mso-style-name:gmail-hljs-type;}
span.gmail-hljs-variable
{mso-style-name:gmail-hljs-variable;}
span.gmail-hljs-operator
{mso-style-name:gmail-hljs-operator;}
span.gmail-hljs-keyword
{mso-style-name:gmail-hljs-keyword;}
span.gmail-hljs-title
{mso-style-name:gmail-hljs-title;}
span.gmail-hljs-string
{mso-style-name:gmail-hljs-string;}
span.gmail-hljs-number
{mso-style-name:gmail-hljs-number;}
span.gmail-hljs-comment
{mso-style-name:gmail-hljs-comment;}
span.EmailStyle29
{mso-style-type:personal-reply;
font-family:"Aptos",sans-serif;
color:windowtext;}
.MsoChpDefault
{mso-style-type:export-only;
font-size:11.0pt;
mso-fareast-language:EN-US;}
@page WordSection1
{size:612.0pt 792.0pt;
margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
{page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-CA" link="blue" vlink="purple" style="word-wrap:break-word">
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US">Here is an example of a Beethoven test passing routine that expects a number for 1 to 10. The Scanner, sc, has already been initialized. I also taught how to use regular expressions
to fine tune what is acceptable input and the acceptable range such that you only need to use readLine so that subsequent input is not messed up when a user enters 23 45 instead of 23.45. Notice that this routine cleans out the buffer with a nextLine at the
end. <o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US"> int number;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US"> do {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US"> System.out.println("Enter a number between 1 and 10: ");<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US"> if (sc.hasNextInt()) { // Check that there is an integer in the keyboard buffer<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US"> number = sc.nextInt(); //
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US"> // Check if the number is in range<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US"> if (number < 1 || number > 10) {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US"> System.out.println("Number out of range.");<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US"> }<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US"> } else { // There was not an integer in the keyboard buffer<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US"> number = -1; // a value that will keep execution in the loop<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US"> System.out.println("You have not entered a number");<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US"> }<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US"> sc.nextLine(); // Clean out the buffer<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US"> } while (number < 1 || number > 10);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US">This tells me that in the paving the onramp universe a readInt or readDbl must clear the keyboard buffer when it encounters a terminating character such as the space, tab, and \n.
Already I can hear the roar over how this breaks the expected behaviour of Scanner such as allowing a list of primitives in the keyboard buffer.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US">Ken<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal"><b><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif">From:</span></b><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif"> Ethan McCue <ethan@mccue.dev>
<br>
<b>Sent:</b> November 7, 2024 11:43 AM<br>
<b>To:</b> Kenneth Fogel <kfogel@dawsoncollege.qc.ca><br>
<b>Cc:</b> discuss@openjdk.org<br>
<b>Subject:</b> Re: How about a readln for numbers?<o:p></o:p></span></p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div>
<p class="MsoNormal">Currently, "don't mix nextLine with next/next int/etc" is an extremely common footgun.<br>
<br>
In one of the coding help discords, this is the auto message we send when people run into trouble with that.<br>
<br>
<span style="font-size:10.5pt;font-family:"Noto Sans",sans-serif;border:none windowtext 1.0pt;padding:0cm">Mixing any
</span><code><span style="font-size:9.0pt;border:none windowtext 1.0pt;padding:0cm">nextXXX</span></code><span style="font-size:10.5pt;font-family:"Noto Sans",sans-serif;border:none windowtext 1.0pt;padding:0cm"> method with
</span><code><span style="font-size:9.0pt;border:none windowtext 1.0pt;padding:0cm">nextLine</span></code><span style="font-size:10.5pt;font-family:"Noto Sans",sans-serif;border:none windowtext 1.0pt;padding:0cm"> from the
</span><code><span style="font-size:9.0pt;border:none windowtext 1.0pt;padding:0cm">Scanner</span></code><span style="font-size:10.5pt;font-family:"Noto Sans",sans-serif;border:none windowtext 1.0pt;padding:0cm"> class for user input, will not ask you for input
again but instead result in an empty line read by </span><code><span style="font-size:9.0pt;border:none windowtext 1.0pt;padding:0cm">nextLine</span></code><span style="font-size:10.5pt;font-family:"Noto Sans",sans-serif;border:none windowtext 1.0pt;padding:0cm">.
To prevent this, when reading user input, always only use </span><code><span style="font-size:9.0pt;border:none windowtext 1.0pt;padding:0cm">nextLine</span></code><span style="font-size:10.5pt;font-family:"Noto Sans",sans-serif;border:none windowtext 1.0pt;padding:0cm">.
If you need an </span><code><span style="font-size:9.0pt;border:none windowtext 1.0pt;padding:0cm">int</span></code><span style="font-size:10.5pt;font-family:"Noto Sans",sans-serif;border:none windowtext 1.0pt;padding:0cm">, do
</span><o:p></o:p></p>
<div>
<pre style="vertical-align:baseline"><span class="gmail-hljs-type"><span style="font-family:"inherit",serif;color:#FF7B72;border:none windowtext 1.0pt;padding:0cm">int</span></span><code><span style="border:none windowtext 1.0pt;padding:0cm"> </span></code><span class="gmail-hljs-variable"><span style="font-family:"inherit",serif;color:#79C0FF;border:none windowtext 1.0pt;padding:0cm">value</span></span><code><span style="border:none windowtext 1.0pt;padding:0cm"> </span></code><span class="gmail-hljs-operator"><span style="font-family:"inherit",serif;color:#79C0FF;border:none windowtext 1.0pt;padding:0cm">=</span></span><code><span style="border:none windowtext 1.0pt;padding:0cm"> Integer.parseInt(scanner.nextLine());</span></code><span style="font-family:"inherit",serif"><o:p></o:p></span></pre>
</div>
<p class="MsoNormal"><span style="font-size:10.5pt;font-family:"Noto Sans",sans-serif;border:none windowtext 1.0pt;padding:0cm">instead of using
</span><code><span style="font-size:9.0pt;border:none windowtext 1.0pt;padding:0cm">nextInt</span></code><span style="font-size:10.5pt;font-family:"Noto Sans",sans-serif;border:none windowtext 1.0pt;padding:0cm">. Assume the following:
</span><o:p></o:p></p>
<div>
<pre style="vertical-align:baseline"><span class="gmail-hljs-type"><span style="font-family:"inherit",serif;color:#FF7B72;border:none windowtext 1.0pt;padding:0cm">Scanner</span></span><code><span style="border:none windowtext 1.0pt;padding:0cm"> </span></code><span class="gmail-hljs-variable"><span style="font-family:"inherit",serif;color:#79C0FF;border:none windowtext 1.0pt;padding:0cm">scanner</span></span><code><span style="border:none windowtext 1.0pt;padding:0cm"> </span></code><span class="gmail-hljs-operator"><span style="font-family:"inherit",serif;color:#79C0FF;border:none windowtext 1.0pt;padding:0cm">=</span></span><code><span style="border:none windowtext 1.0pt;padding:0cm"> </span></code><span class="gmail-hljs-keyword"><span style="font-family:"inherit",serif;color:#FF7B72;border:none windowtext 1.0pt;padding:0cm">new</span></span><code><span style="border:none windowtext 1.0pt;padding:0cm"> </span></code><span class="gmail-hljs-title"><span style="font-family:"inherit",serif;color:#D2A8FF;border:none windowtext 1.0pt;padding:0cm">Scanner</span></span><code><span style="border:none windowtext 1.0pt;padding:0cm">(System.in);<o:p></o:p></span></code></pre>
<pre style="vertical-align:baseline"><code><span style="border:none windowtext 1.0pt;padding:0cm"><o:p> </o:p></span></code></pre>
<pre style="vertical-align:baseline"><code><span style="border:none windowtext 1.0pt;padding:0cm">System.out.println(</span></code><span class="gmail-hljs-string"><span style="font-family:"inherit",serif;color:#A5D6FF;border:none windowtext 1.0pt;padding:0cm">"Enter your age:"</span></span><code><span style="border:none windowtext 1.0pt;padding:0cm">);<o:p></o:p></span></code></pre>
<pre style="vertical-align:baseline"><span class="gmail-hljs-type"><span style="font-family:"inherit",serif;color:#FF7B72;border:none windowtext 1.0pt;padding:0cm">int</span></span><code><span style="border:none windowtext 1.0pt;padding:0cm"> </span></code><span class="gmail-hljs-variable"><span style="font-family:"inherit",serif;color:#79C0FF;border:none windowtext 1.0pt;padding:0cm">age</span></span><code><span style="border:none windowtext 1.0pt;padding:0cm"> </span></code><span class="gmail-hljs-operator"><span style="font-family:"inherit",serif;color:#79C0FF;border:none windowtext 1.0pt;padding:0cm">=</span></span><code><span style="border:none windowtext 1.0pt;padding:0cm"> scanner.nextInt();<o:p></o:p></span></code></pre>
<pre style="vertical-align:baseline"><code><span style="border:none windowtext 1.0pt;padding:0cm">System.out.println(</span></code><span class="gmail-hljs-string"><span style="font-family:"inherit",serif;color:#A5D6FF;border:none windowtext 1.0pt;padding:0cm">"Enter your name:"</span></span><code><span style="border:none windowtext 1.0pt;padding:0cm">);<o:p></o:p></span></code></pre>
<pre style="vertical-align:baseline"><span class="gmail-hljs-type"><span style="font-family:"inherit",serif;color:#FF7B72;border:none windowtext 1.0pt;padding:0cm">String</span></span><code><span style="border:none windowtext 1.0pt;padding:0cm"> </span></code><span class="gmail-hljs-variable"><span style="font-family:"inherit",serif;color:#79C0FF;border:none windowtext 1.0pt;padding:0cm">name</span></span><code><span style="border:none windowtext 1.0pt;padding:0cm"> </span></code><span class="gmail-hljs-operator"><span style="font-family:"inherit",serif;color:#79C0FF;border:none windowtext 1.0pt;padding:0cm">=</span></span><code><span style="border:none windowtext 1.0pt;padding:0cm"> scanner.nextLine();<o:p></o:p></span></code></pre>
<pre style="vertical-align:baseline"><code><span style="border:none windowtext 1.0pt;padding:0cm"><o:p> </o:p></span></code></pre>
<pre style="vertical-align:baseline"><code><span style="border:none windowtext 1.0pt;padding:0cm">System.out.println(</span></code><span class="gmail-hljs-string"><span style="font-family:"inherit",serif;color:#A5D6FF;border:none windowtext 1.0pt;padding:0cm">"Hello "</span></span><code><span style="border:none windowtext 1.0pt;padding:0cm"> + name + </span></code><span class="gmail-hljs-string"><span style="font-family:"inherit",serif;color:#A5D6FF;border:none windowtext 1.0pt;padding:0cm">", you are "</span></span><code><span style="border:none windowtext 1.0pt;padding:0cm"> + age + </span></code><span class="gmail-hljs-string"><span style="font-family:"inherit",serif;color:#A5D6FF;border:none windowtext 1.0pt;padding:0cm">" years old"</span></span><code><span style="border:none windowtext 1.0pt;padding:0cm">);</span></code><span style="font-family:"inherit",serif"><o:p></o:p></span></pre>
</div>
<p class="MsoNormal"><span style="font-size:10.5pt;font-family:"Noto Sans",sans-serif;border:none windowtext 1.0pt;padding:0cm">When executing this code, you will be asked to enter an age, suppose you enter
</span><code><span style="font-size:9.0pt;border:none windowtext 1.0pt;padding:0cm">20</span></code><span style="font-size:10.5pt;font-family:"Noto Sans",sans-serif;border:none windowtext 1.0pt;padding:0cm">. However, the code will not ask you to actually input
a name and the output will be: </span><o:p></o:p></p>
<div>
<pre style="vertical-align:baseline"><code><span style="border:none windowtext 1.0pt;padding:0cm">Hello , you are </span></code><span class="gmail-hljs-number"><span style="font-family:"inherit",serif;color:#79C0FF;border:none windowtext 1.0pt;padding:0cm">20</span></span><code><span style="border:none windowtext 1.0pt;padding:0cm"> years old.</span></code><span style="font-family:"inherit",serif"><o:p></o:p></span></pre>
</div>
<p class="MsoNormal"><span style="font-size:10.5pt;font-family:"Noto Sans",sans-serif;border:none windowtext 1.0pt;padding:0cm">The reason why is that when you hit the
</span><code><span style="font-size:9.0pt;border:none windowtext 1.0pt;padding:0cm">enter</span></code><span style="font-size:10.5pt;font-family:"Noto Sans",sans-serif;border:none windowtext 1.0pt;padding:0cm"> button, your actual input is
</span><o:p></o:p></p>
<div>
<pre style="vertical-align:baseline"><span class="gmail-hljs-number"><span style="font-family:"inherit",serif;color:#79C0FF;border:none windowtext 1.0pt;padding:0cm">20</span></span><code><span style="border:none windowtext 1.0pt;padding:0cm">\n</span></code><span style="font-family:"inherit",serif"><o:p></o:p></span></pre>
</div>
<p class="MsoNormal"><span style="font-size:10.5pt;font-family:"Noto Sans",sans-serif;border:none windowtext 1.0pt;padding:0cm">and not just
</span><code><span style="font-size:9.0pt;border:none windowtext 1.0pt;padding:0cm">20</span></code><span style="font-size:10.5pt;font-family:"Noto Sans",sans-serif;border:none windowtext 1.0pt;padding:0cm">. A call to
</span><code><span style="font-size:9.0pt;border:none windowtext 1.0pt;padding:0cm">nextInt</span></code><span style="font-size:10.5pt;font-family:"Noto Sans",sans-serif;border:none windowtext 1.0pt;padding:0cm"> will now consume the
</span><code><span style="font-size:9.0pt;border:none windowtext 1.0pt;padding:0cm">20</span></code><span style="font-size:10.5pt;font-family:"Noto Sans",sans-serif;border:none windowtext 1.0pt;padding:0cm"> and leave the newline symbol
</span><code><span style="font-size:9.0pt;border:none windowtext 1.0pt;padding:0cm">\n</span></code><span style="font-size:10.5pt;font-family:"Noto Sans",sans-serif;border:none windowtext 1.0pt;padding:0cm"> in the internal input buffer of
</span><code><span style="font-size:9.0pt;border:none windowtext 1.0pt;padding:0cm">System.in</span></code><span style="font-size:10.5pt;font-family:"Noto Sans",sans-serif;border:none windowtext 1.0pt;padding:0cm">. The call to
</span><code><span style="font-size:9.0pt;border:none windowtext 1.0pt;padding:0cm">nextLine</span></code><span style="font-size:10.5pt;font-family:"Noto Sans",sans-serif;border:none windowtext 1.0pt;padding:0cm"> will now not lead to a new input, since there
is still unread input left in </span><code><span style="font-size:9.0pt;border:none windowtext 1.0pt;padding:0cm">System.in</span></code><span style="font-size:10.5pt;font-family:"Noto Sans",sans-serif;border:none windowtext 1.0pt;padding:0cm">. So it will
read the </span><code><span style="font-size:9.0pt;border:none windowtext 1.0pt;padding:0cm">\n</span></code><span style="font-size:10.5pt;font-family:"Noto Sans",sans-serif;border:none windowtext 1.0pt;padding:0cm">, leading to an empty input. So every user
input is not only a number, but a </span><b><span style="font-size:10.5pt;font-family:"inherit",serif;border:none windowtext 1.0pt;padding:0cm">full line</span></b><span style="font-size:10.5pt;font-family:"Noto Sans",sans-serif;border:none windowtext 1.0pt;padding:0cm">.
As such, it makes much more sense to also use </span><code><span style="font-size:9.0pt;border:none windowtext 1.0pt;padding:0cm">nextLine()</span></code><span style="font-size:10.5pt;font-family:"Noto Sans",sans-serif;border:none windowtext 1.0pt;padding:0cm">,
even if reading just an age. The corrected code which works as intended is: </span>
<o:p></o:p></p>
<div>
<pre style="vertical-align:baseline"><span class="gmail-hljs-type"><span style="font-family:"inherit",serif;color:#FF7B72;border:none windowtext 1.0pt;padding:0cm">Scanner</span></span><code><span style="border:none windowtext 1.0pt;padding:0cm"> </span></code><span class="gmail-hljs-variable"><span style="font-family:"inherit",serif;color:#79C0FF;border:none windowtext 1.0pt;padding:0cm">scanner</span></span><code><span style="border:none windowtext 1.0pt;padding:0cm"> </span></code><span class="gmail-hljs-operator"><span style="font-family:"inherit",serif;color:#79C0FF;border:none windowtext 1.0pt;padding:0cm">=</span></span><code><span style="border:none windowtext 1.0pt;padding:0cm"> </span></code><span class="gmail-hljs-keyword"><span style="font-family:"inherit",serif;color:#FF7B72;border:none windowtext 1.0pt;padding:0cm">new</span></span><code><span style="border:none windowtext 1.0pt;padding:0cm"> </span></code><span class="gmail-hljs-title"><span style="font-family:"inherit",serif;color:#D2A8FF;border:none windowtext 1.0pt;padding:0cm">Scanner</span></span><code><span style="border:none windowtext 1.0pt;padding:0cm">(System.in);<o:p></o:p></span></code></pre>
<pre style="vertical-align:baseline"><code><span style="border:none windowtext 1.0pt;padding:0cm"><o:p> </o:p></span></code></pre>
<pre style="vertical-align:baseline"><code><span style="border:none windowtext 1.0pt;padding:0cm">System.out.println(</span></code><span class="gmail-hljs-string"><span style="font-family:"inherit",serif;color:#A5D6FF;border:none windowtext 1.0pt;padding:0cm">"Enter your age:"</span></span><code><span style="border:none windowtext 1.0pt;padding:0cm">);<o:p></o:p></span></code></pre>
<pre style="vertical-align:baseline"><span class="gmail-hljs-comment"><span style="font-family:"inherit",serif;color:#8B949E;border:none windowtext 1.0pt;padding:0cm">// Now nextLine, not nextInt anymore</span></span><code><span style="border:none windowtext 1.0pt;padding:0cm"><o:p></o:p></span></code></pre>
<pre style="vertical-align:baseline"><span class="gmail-hljs-type"><span style="font-family:"inherit",serif;color:#FF7B72;border:none windowtext 1.0pt;padding:0cm">int</span></span><code><span style="border:none windowtext 1.0pt;padding:0cm"> </span></code><span class="gmail-hljs-variable"><span style="font-family:"inherit",serif;color:#79C0FF;border:none windowtext 1.0pt;padding:0cm">age</span></span><code><span style="border:none windowtext 1.0pt;padding:0cm"> </span></code><span class="gmail-hljs-operator"><span style="font-family:"inherit",serif;color:#79C0FF;border:none windowtext 1.0pt;padding:0cm">=</span></span><code><span style="border:none windowtext 1.0pt;padding:0cm"> Integer.parseInt(scanner.nextLine());<o:p></o:p></span></code></pre>
<pre style="vertical-align:baseline"><code><span style="border:none windowtext 1.0pt;padding:0cm">System.out.println(</span></code><span class="gmail-hljs-string"><span style="font-family:"inherit",serif;color:#A5D6FF;border:none windowtext 1.0pt;padding:0cm">"Enter your name:"</span></span><code><span style="border:none windowtext 1.0pt;padding:0cm">);<o:p></o:p></span></code></pre>
<pre style="vertical-align:baseline"><span class="gmail-hljs-type"><span style="font-family:"inherit",serif;color:#FF7B72;border:none windowtext 1.0pt;padding:0cm">String</span></span><code><span style="border:none windowtext 1.0pt;padding:0cm"> </span></code><span class="gmail-hljs-variable"><span style="font-family:"inherit",serif;color:#79C0FF;border:none windowtext 1.0pt;padding:0cm">name</span></span><code><span style="border:none windowtext 1.0pt;padding:0cm"> </span></code><span class="gmail-hljs-operator"><span style="font-family:"inherit",serif;color:#79C0FF;border:none windowtext 1.0pt;padding:0cm">=</span></span><code><span style="border:none windowtext 1.0pt;padding:0cm"> scanner.nextLine();<o:p></o:p></span></code></pre>
<pre style="vertical-align:baseline"><code><span style="border:none windowtext 1.0pt;padding:0cm"><o:p> </o:p></span></code></pre>
<pre style="vertical-align:baseline"><code><span style="border:none windowtext 1.0pt;padding:0cm">System.out.println(</span></code><span class="gmail-hljs-string"><span style="font-family:"inherit",serif;color:#A5D6FF;border:none windowtext 1.0pt;padding:0cm">"Hello "</span></span><code><span style="border:none windowtext 1.0pt;padding:0cm"> + name + </span></code><span class="gmail-hljs-string"><span style="font-family:"inherit",serif;color:#A5D6FF;border:none windowtext 1.0pt;padding:0cm">", you are "</span></span><code><span style="border:none windowtext 1.0pt;padding:0cm"> + age + </span></code><span class="gmail-hljs-string"><span style="font-family:"inherit",serif;color:#A5D6FF;border:none windowtext 1.0pt;padding:0cm">" years old"</span></span><code><span style="border:none windowtext 1.0pt;padding:0cm">);</span></code><span style="font-family:"inherit",serif"><o:p></o:p></span></pre>
</div>
<p class="MsoNormal"><span style="font-size:10.5pt;font-family:"Noto Sans",sans-serif;border:none windowtext 1.0pt;padding:0cm">The
</span><code><span style="font-size:9.0pt;border:none windowtext 1.0pt;padding:0cm">nextXXX</span></code><span style="font-size:10.5pt;font-family:"Noto Sans",sans-serif;border:none windowtext 1.0pt;padding:0cm"> methods, such as
</span><code><span style="font-size:9.0pt;border:none windowtext 1.0pt;padding:0cm">nextInt</span></code><span style="font-size:10.5pt;font-family:"Noto Sans",sans-serif;border:none windowtext 1.0pt;padding:0cm"> can be useful when reading multi-input from
a single line. For example when you enter </span><code><span style="font-size:9.0pt;border:none windowtext 1.0pt;padding:0cm">20 John</span></code><span style="font-size:10.5pt;font-family:"Noto Sans",sans-serif;border:none windowtext 1.0pt;padding:0cm"> in
a single line.</span><o:p></o:p></p>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div>
<p class="MsoNormal">On Thu, Nov 7, 2024, 11:36 AM Kenneth Fogel <<a href="mailto:kfogel@dawsoncollege.qc.ca" target="_blank">kfogel@dawsoncollege.qc.ca</a>> wrote:<o:p></o:p></p>
</div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0cm 0cm 0cm 6.0pt;margin-left:4.8pt;margin-right:0cm">
<div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-US">The readln method introduced as part java.base is great because it includes the prompt for the input. The only shortcoming is that if the input must be a number
then you still need to employ a static class member such as Double.parseDouble() to make it a number:</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-US"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-US">// Currently</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-US">var loan = Double.parseDouble(readln("Loan: "));</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-US"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-US">// My delusional idea</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-US">var loan = readDbl("Loan: ");</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-US"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-US">I can think of reasons why this could be a bad idea. I taught my students to use a construct using Scanner to create a console input that passed my Beethoven
test (while humming Beethoven’s 5<sup>th</sup> symphony randomly strike keys on your keyboard as if you were playing the symphony and your code should just report invalid input and not an exception). If we had a readInt and/or readDbl they would not pass this
test. That Python would happily accept anything and then fail when the value was used in a calculation is no better. But, for learning Java could we have a readInt or readDbl alongside readln? I know that
</span>DataInputStream has such methods, but without a prompt and it must be attached to an input stream such as a file.<o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-US"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-US">As always, just thinking out loud. Feel free to use my name in vain.</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-US"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-US">Ken</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-US"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-US"> </span><o:p></o:p></p>
</div>
</div>
</blockquote>
</div>
</div>
</body>
</html>