<!DOCTYPE html><html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body>
    <font size="4" face="monospace">Short answer: Absolutely not.<br>
      <br>
      More discussion elsewhere in this thread.<br>
    </font><br>
    <br>
    <div class="moz-cite-prefix">On 11/7/2024 2:16 PM, Kenneth Fogel
      wrote:<br>
    </div>
    <blockquote type="cite" cite="mid:QB1PPF5DAA3F5875905934239A8CEA81D428D5C2@QB1PPF5DAA3F587.CANPRD01.PROD.OUTLOOK.COM">
      
      <meta name="Generator" content="Microsoft Word 15 (filtered medium)">
      <style>@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:"Noto Sans";}@font-face
        {font-family:inherit;
        panose-1:0 0 0 0 0 0 0 0 0 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        font-size:11.0pt;
        font-family:"Aptos",sans-serif;
        mso-ligatures:standardcontextual;
        mso-fareast-language:EN-US;}a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#467886;
        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.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Aptos",sans-serif;
        color:windowtext;}span.HTMLPreformattedChar
        {mso-style-name:"HTML Preformatted Char";
        mso-style-priority:99;
        mso-style-link:"HTML Preformatted";
        font-family:"Courier New";
        mso-ligatures:none;
        mso-fareast-language:EN-CA;}.MsoChpDefault
        {mso-style-type:export-only;
        font-size:11.0pt;
        mso-fareast-language:EN-US;}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]-->
      <div class="WordSection1">
        <p class="MsoNormal"><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:<o:p></o:p></span></p>
        <p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
        <p class="MsoNormal"><span lang="EN-US">// Currently<o:p></o:p></span></p>
        <p class="MsoNormal"><span lang="EN-US">var loan =
            Double.parseDouble(readln("Loan: "));<o:p></o:p></span></p>
        <p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
        <p class="MsoNormal"><span lang="EN-US">// My delusional idea<o:p></o:p></span></p>
        <p class="MsoNormal"><span lang="EN-US">var loan =
            readDbl("Loan: ");<o:p></o:p></span></p>
        <p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
        <p class="MsoNormal"><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"><span lang="EN-US"><o:p> </o:p></span></p>
        <p class="MsoNormal"><span lang="EN-US">As always, just thinking
            out loud. Feel free to use my name in vain.<o:p></o:p></span></p>
        <p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
        <p class="MsoNormal"><span lang="EN-US">Ken<o:p></o:p></span></p>
        <p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
        <p class="MsoNormal"><span lang="EN-US">This message and a back
            and forth with Ethan McCue began in the OpenJDK Discus list
            and we were asked to move it here. Here is the summary of
            messages in the order they were sent to the list. The
            message above is the last one.<o:p></o:p></span></p>
        <p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
        <p class="MsoNormal"><span style="font-family:"Courier New"">void main() {</span><br>
          <span style="font-family:"Courier New"">    int
            number;</span><br>
          <span style="font-family:"Courier New"">    do {</span><br>
          <span style="font-family:"Courier New"">       
            String input = readln("Enter a number between 1 and 10: ");</span><br>
          <span style="font-family:"Courier New"">        try
            {</span><br>
          <span style="font-family:"Courier New"">           
            number = Integer.parseInt(input);</span><br>
          <span style="font-family:"Courier New"">           
            if (number < 1 || number > 10) {</span><br>
          <span style="font-family:"Courier New"">           
                println("Number out of range");</span><br>
          <span style="font-family:"Courier New"">           
            }</span><br>
          <br>
          <span style="font-family:"Courier New"">           
            // All is well</span><br>
          <span style="font-family:"Courier New"">           
            break;</span><br>
          <span style="font-family:"Courier New"">        }
            catch (NumberFormatException _) {</span><br>
          <span style="font-family:"Courier New"">           
            println("You have not entered a number");</span><br>
          <span style="font-family:"Courier New"">        }</span><br>
          <span style="font-family:"Courier New"">    } while
            (true);</span><br>
          <br>
          <span style="font-family:"Courier New"">   
            println(number);</span><br>
          <span style="font-family:"Courier New"">}</span><br>
          <br>
          <span style="font-family:"Arial",sans-serif">For
            color on how that might affect the pedagogy:<br>
            <br>
            "First we need to get input from the user, this is a String
            which represents text"<br>
            <br>
          </span><span style="font-family:"Courier New"">void
            main() {</span><br>
          <span style="font-family:"Courier New"">    String
            input = readln("Enter a number between 1 and 10: ");</span><br>
          <span style="font-family:"Courier New"">}</span><br>
          <br>
          <span style="font-family:"Arial",sans-serif">"We can
            turn a String into an int by writing
            Integer.parseInt(<text here>). If what they wrote
            isn't a number it will crash"<br>
            <br>
          </span><span style="font-family:"Courier New"">void
            main() {<br>
                String input = readln("Enter a number between 1 and 10:
            ");<br>
                int number = Integer.parseInt(input);<br>
            }</span><span style="font-size:12.0pt;mso-ligatures:none;mso-fareast-language:EN-CA"><o:p></o:p></span></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal" style="margin-bottom:12.0pt"><span style="font-family:"Arial",sans-serif">"To handle
            crashes we can put the code that might crash inside of try {
            }, then write the way it might crash in a catch clause"<br>
          </span><br>
          <span style="font-family:"Courier New"">void main()
            {<br>
                String input = readln("Enter a number between 1 and 10:
            ");<br>
                try {<br>
                    int number = Integer.parseInt(input);<br>
                    println("You gave: " + number);<br>
                } catch (NumberFormatException e) {<br>
                    println("Bad number: " + input);<br>
                }<br>
            }</span><o:p></o:p></p>
        <p class="MsoNormal">"If they gave a number that wasn't between
          1 and 10 ..."<br>
          <br>
          <span style="font-family:"Courier New"">void main()
            {</span><br>
          <span style="font-family:"Courier New"">    String
            input = readln("Enter a number between 1 and 10: ");</span><br>
          <span style="font-family:"Courier New"">    try {</span><br>
          <span style="font-family:"Courier New"">        int
            number = Integer.parseInt(input);</span><br>
          <span style="font-family:"Courier New"">        if
            (number < 1 || number > 10) {</span><br>
          <span style="font-family:"Courier New"">           
            println("Number is not between 1 and 10: " + number);</span><br>
          <span style="font-family:"Courier New"">        }</span><br>
          <span style="font-family:"Courier New"">        else
            {</span><br>
          <span style="font-family:"Courier New"">           
            println("You gave: " + number);</span><br>
          <span style="font-family:"Courier New"">        }</span><br>
          <span style="font-family:"Courier New"">    } catch
            (NumberFormatException e) {</span><br>
          <span style="font-family:"Courier New"">       
            println("Bad number: " + input);</span><br>
          <span style="font-family:"Courier New"">    }</span><br>
          <span style="font-family:"Courier New"">}</span><br>
          <br>
          <span style="font-family:"Arial",sans-serif">"Now we
            want to keep asking them until they give a valid input. To
            do this, first delay the assignment of number"<br>
            <br>
          </span><span style="font-family:"Courier New"">void
            main() {</span><br>
          <span style="font-family:"Courier New"">    String
            input = readln("Enter a number between 1 and 10: ");</span><br>
          <span style="font-family:"Courier New"">    int
            number;</span><br>
          <span style="font-family:"Courier New"">    try {</span><br>
          <span style="font-family:"Courier New"">       
            number = Integer.parseInt(input);</span><br>
          <span style="font-family:"Courier New"">        if
            (number < 1 || number > 10) {</span><br>
          <span style="font-family:"Courier New"">           
            println("Number is not between 1 and 10: " + number);</span><br>
          <span style="font-family:"Courier New"">        }</span><br>
          <span style="font-family:"Courier New"">        else
            {</span><br>
          <span style="font-family:"Courier New"">           
            println("You gave: " + number);</span><br>
          <span style="font-family:"Courier New"">        }</span><br>
          <span style="font-family:"Courier New"">    } catch
            (NumberFormatException e) {</span><br>
          <span style="font-family:"Courier New"">       
            println("Bad number: " + input);</span><br>
          <span style="font-family:"Courier New"">    }</span><br>
          <span style="font-family:"Courier New"">}</span><br>
          <span style="font-family:"Arial",sans-serif"><br>
            ... and so on until you reach</span><o:p></o:p></p>
        <p class="MsoNormal"><span style="font-family:"Arial",sans-serif"><br>
          </span><span style="font-family:"Courier New"">void
            main() {<br>
                String input = readln("Enter a number between 1 and 10:
            ");<br>
                <br>
                int number;<br>
                do {<br>
                    try {<br>
                        number = Integer.parseInt(input);<br>
                        if (number < 1 || number > 10) {<br>
                            println("Number is not between 1 and 10: " +
            number);<br>
                        }<br>
                        else {<br>
                            break;<br>
                        }<br>
                    } catch (NumberFormatException e) {<br>
                        println("Bad number: " + input);<br>
                    }<br>
                } while (true);<br>
            <br>
                println("You gave: " + number);<br>
            }</span><o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">On Thu, Nov 7, 2024 at 12:50<span style="font-family:"Cambria Math",serif"> </span>PM
          Ethan McCue <<a href="mailto:ethan@mccue.dev" moz-do-not-send="true" class="moz-txt-link-freetext">ethan@mccue.dev</a>>
          wrote:<o:p></o:p></p>
        <p class="MsoNormal">So with all that context, do you see why
          accepting <span style="font-family:"Courier New"">Double.parseDouble(readln());</span><span style="font-family:"Arial",sans-serif"> might be
            worth it?<br>
            <br>
            "Paving the onramp" shouldn't mean only "paving the first 48
            hours." The convenience afforded by a dedicated
          </span><span style="font-family:"Courier New"">readDouble</span><span style="font-family:"Arial",sans-serif">, at least
            to me, feels outweighed</span><o:p></o:p></p>
        <p class="MsoNormal"><span style="font-family:"Arial",sans-serif">by<br>
            <br>
            * The loss of a perfectly good opportunity to explain the
            fundamentals of parsing (strings represent text, you can
            interpret that text by....)<br>
            * The loss of a perfectly good opportunity to teach basic
            exception handling<br>
            * The divergence with the behavior of Scanner<br>
            * The combinatorial explosion of "why not </span><span style="font-family:"Courier New"">readByte</span><span style="font-family:"Arial",sans-serif">?"</span><o:p></o:p></p>
        <p class="MsoNormal"><span style="font-family:"Arial",sans-serif">* The
            privileged position it puts primitives in as the end-point
            of interpreting user input<br>
            * Guns, Feet<br>
            <br>
            (I've separately voiced my concerns about </span><span style="font-family:"Courier New"">readln</span><span style="font-family:"Arial",sans-serif"> in this
            regard.)</span><o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">On Thu, Nov 7, 2024 at 12:40<span style="font-family:"Cambria Math",serif"> </span>PM
          Kenneth Fogel <<a href="mailto:kfogel@dawsoncollege.qc.ca" target="_blank" moz-do-not-send="true" class="moz-txt-link-freetext">kfogel@dawsoncollege.qc.ca</a>>
          wrote:<o:p></o:p></p>
        <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">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></p>
        <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
        <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">      
           int number;<o:p></o:p></p>
        <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">       
          do {<o:p></o:p></p>
        <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">           
          System.out.println("Enter a number between 1 and 10: ");<o:p></o:p></p>
        <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">           
          if (sc.hasNextInt()) { // Check that there is an integer in
          the keyboard buffer<o:p></o:p></p>
        <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">               
          number = sc.nextInt(); //
          <o:p></o:p></p>
        <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">                //
          Check if the number is in range<o:p></o:p></p>
        <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">               
          if (number < 1 || number > 10) {<o:p></o:p></p>
        <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">                   
          System.out.println("Number out of range.");<o:p></o:p></p>
        <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">               
          }<o:p></o:p></p>
        <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">           
          } else { // There was not an integer in the keyboard buffer<o:p></o:p></p>
        <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">               
          number = -1; // a value that will keep execution in the loop<o:p></o:p></p>
        <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">               
          System.out.println("You have not entered a number");<o:p></o:p></p>
        <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">           
          }<o:p></o:p></p>
        <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">           
          sc.nextLine(); // Clean out the buffer<o:p></o:p></p>
        <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">       
          } while (number < 1 || number > 10);<o:p></o:p></p>
        <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
        <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">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></p>
        <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
        <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">Ken<o:p></o:p></p>
        <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
        <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
        <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><b><span lang="EN-US" style="font-family:"Calibri",sans-serif">From:</span></b><span lang="EN-US" style="font-family:"Calibri",sans-serif"> Ethan
            McCue <<a href="mailto:ethan@mccue.dev" target="_blank" moz-do-not-send="true" class="moz-txt-link-freetext">ethan@mccue.dev</a>>
            <br>
            <b>Sent:</b> November 7, 2024 11:43 AM<br>
            <b>To:</b> Kenneth Fogel <<a href="mailto:kfogel@dawsoncollege.qc.ca" target="_blank" moz-do-not-send="true" class="moz-txt-link-freetext">kfogel@dawsoncollege.qc.ca</a>><br>
            <b>Cc:</b> <a href="mailto:discuss@openjdk.org" target="_blank" moz-do-not-send="true" class="moz-txt-link-freetext">discuss@openjdk.org</a><br>
            <b>Subject:</b> Re: How about a readln for numbers?</span><o:p></o:p></p>
        <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
        <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">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>
        <pre style="vertical-align:baseline"><span style="font-family:"inherit",serif;color:#FF7B72;border:none windowtext 1.0pt;padding:0cm">int</span><code><span style="border:none windowtext 1.0pt;padding:0cm"> </span></code><span style="font-family:"inherit",serif;color:#79C0FF;border:none windowtext 1.0pt;padding:0cm">value</span><code><span style="border:none windowtext 1.0pt;padding:0cm"> </span></code><span style="font-family:"inherit",serif;color:#79C0FF;border:none windowtext 1.0pt;padding:0cm">=</span><code><span style="border:none windowtext 1.0pt;padding:0cm"> Integer.parseInt(scanner.nextLine());</span></code><o:p></o:p></pre>
        <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><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>
        <pre style="vertical-align:baseline"><span style="font-family:"inherit",serif;color:#FF7B72;border:none windowtext 1.0pt;padding:0cm">Scanner</span><code><span style="border:none windowtext 1.0pt;padding:0cm"> </span></code><span style="font-family:"inherit",serif;color:#79C0FF;border:none windowtext 1.0pt;padding:0cm">scanner</span><code><span style="border:none windowtext 1.0pt;padding:0cm"> </span></code><span style="font-family:"inherit",serif;color:#79C0FF;border:none windowtext 1.0pt;padding:0cm">=</span><code><span style="border:none windowtext 1.0pt;padding:0cm"> </span></code><span style="font-family:"inherit",serif;color:#FF7B72;border:none windowtext 1.0pt;padding:0cm">new</span><code><span style="border:none windowtext 1.0pt;padding:0cm"> </span></code><span style="font-family:"inherit",serif;color:#D2A8FF;border:none windowtext 1.0pt;padding:0cm">Scanner</span><code><span style="border:none windowtext 1.0pt;padding:0cm">(System.in);</span></code><o:p></o:p></pre>
        <pre style="vertical-align:baseline"><code><span style="border:none windowtext 1.0pt;padding:0cm"> </span></code><o:p></o:p></pre>
        <pre style="vertical-align:baseline"><code><span style="border:none windowtext 1.0pt;padding:0cm">System.out.println(</span></code><span style="font-family:"inherit",serif;color:#A5D6FF;border:none windowtext 1.0pt;padding:0cm">"Enter your age:"</span><code><span style="border:none windowtext 1.0pt;padding:0cm">);</span></code><o:p></o:p></pre>
        <pre style="vertical-align:baseline"><span style="font-family:"inherit",serif;color:#FF7B72;border:none windowtext 1.0pt;padding:0cm">int</span><code><span style="border:none windowtext 1.0pt;padding:0cm"> </span></code><span style="font-family:"inherit",serif;color:#79C0FF;border:none windowtext 1.0pt;padding:0cm">age</span><code><span style="border:none windowtext 1.0pt;padding:0cm"> </span></code><span style="font-family:"inherit",serif;color:#79C0FF;border:none windowtext 1.0pt;padding:0cm">=</span><code><span style="border:none windowtext 1.0pt;padding:0cm"> scanner.nextInt();</span></code><o:p></o:p></pre>
        <pre style="vertical-align:baseline"><code><span style="border:none windowtext 1.0pt;padding:0cm">System.out.println(</span></code><span style="font-family:"inherit",serif;color:#A5D6FF;border:none windowtext 1.0pt;padding:0cm">"Enter your name:"</span><code><span style="border:none windowtext 1.0pt;padding:0cm">);</span></code><o:p></o:p></pre>
        <pre style="vertical-align:baseline"><span style="font-family:"inherit",serif;color:#FF7B72;border:none windowtext 1.0pt;padding:0cm">String</span><code><span style="border:none windowtext 1.0pt;padding:0cm"> </span></code><span style="font-family:"inherit",serif;color:#79C0FF;border:none windowtext 1.0pt;padding:0cm">name</span><code><span style="border:none windowtext 1.0pt;padding:0cm"> </span></code><span style="font-family:"inherit",serif;color:#79C0FF;border:none windowtext 1.0pt;padding:0cm">=</span><code><span style="border:none windowtext 1.0pt;padding:0cm"> scanner.nextLine();</span></code><o:p></o:p></pre>
        <pre style="vertical-align:baseline"><code><span style="border:none windowtext 1.0pt;padding:0cm"> </span></code><o:p></o:p></pre>
        <pre style="vertical-align:baseline"><code><span style="border:none windowtext 1.0pt;padding:0cm">System.out.println(</span></code><span style="font-family:"inherit",serif;color:#A5D6FF;border:none windowtext 1.0pt;padding:0cm">"Hello "</span><code><span style="border:none windowtext 1.0pt;padding:0cm"> + name + </span></code><span style="font-family:"inherit",serif;color:#A5D6FF;border:none windowtext 1.0pt;padding:0cm">", you are "</span><code><span style="border:none windowtext 1.0pt;padding:0cm"> + age + </span></code><span style="font-family:"inherit",serif;color:#A5D6FF;border:none windowtext 1.0pt;padding:0cm">" years old"</span><code><span style="border:none windowtext 1.0pt;padding:0cm">);</span></code><o:p></o:p></pre>
        <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><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>
        <pre style="vertical-align:baseline"><code><span style="border:none windowtext 1.0pt;padding:0cm">Hello , you are </span></code><span style="font-family:"inherit",serif;color:#79C0FF;border:none windowtext 1.0pt;padding:0cm">20</span><code><span style="border:none windowtext 1.0pt;padding:0cm"> years old.</span></code><o:p></o:p></pre>
        <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><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>
        <pre style="vertical-align:baseline"><span style="font-family:"inherit",serif;color:#79C0FF;border:none windowtext 1.0pt;padding:0cm">20</span><code><span style="border:none windowtext 1.0pt;padding:0cm">\n</span></code><o:p></o:p></pre>
        <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><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>
        <pre style="vertical-align:baseline"><span style="font-family:"inherit",serif;color:#FF7B72;border:none windowtext 1.0pt;padding:0cm">Scanner</span><code><span style="border:none windowtext 1.0pt;padding:0cm"> </span></code><span style="font-family:"inherit",serif;color:#79C0FF;border:none windowtext 1.0pt;padding:0cm">scanner</span><code><span style="border:none windowtext 1.0pt;padding:0cm"> </span></code><span style="font-family:"inherit",serif;color:#79C0FF;border:none windowtext 1.0pt;padding:0cm">=</span><code><span style="border:none windowtext 1.0pt;padding:0cm"> </span></code><span style="font-family:"inherit",serif;color:#FF7B72;border:none windowtext 1.0pt;padding:0cm">new</span><code><span style="border:none windowtext 1.0pt;padding:0cm"> </span></code><span style="font-family:"inherit",serif;color:#D2A8FF;border:none windowtext 1.0pt;padding:0cm">Scanner</span><code><span style="border:none windowtext 1.0pt;padding:0cm">(System.in);</span></code><o:p></o:p></pre>
        <pre style="vertical-align:baseline"><code><span style="border:none windowtext 1.0pt;padding:0cm"> </span></code><o:p></o:p></pre>
        <pre style="vertical-align:baseline"><code><span style="border:none windowtext 1.0pt;padding:0cm">System.out.println(</span></code><span style="font-family:"inherit",serif;color:#A5D6FF;border:none windowtext 1.0pt;padding:0cm">"Enter your age:"</span><code><span style="border:none windowtext 1.0pt;padding:0cm">);</span></code><o:p></o:p></pre>
        <pre style="vertical-align:baseline"><span style="font-family:"inherit",serif;color:#8B949E;border:none windowtext 1.0pt;padding:0cm">// Now nextLine, not nextInt anymore</span><o:p></o:p></pre>
        <pre style="vertical-align:baseline"><span style="font-family:"inherit",serif;color:#FF7B72;border:none windowtext 1.0pt;padding:0cm">int</span><code><span style="border:none windowtext 1.0pt;padding:0cm"> </span></code><span style="font-family:"inherit",serif;color:#79C0FF;border:none windowtext 1.0pt;padding:0cm">age</span><code><span style="border:none windowtext 1.0pt;padding:0cm"> </span></code><span style="font-family:"inherit",serif;color:#79C0FF;border:none windowtext 1.0pt;padding:0cm">=</span><code><span style="border:none windowtext 1.0pt;padding:0cm"> Integer.parseInt(scanner.nextLine());</span></code><o:p></o:p></pre>
        <pre style="vertical-align:baseline"><code><span style="border:none windowtext 1.0pt;padding:0cm">System.out.println(</span></code><span style="font-family:"inherit",serif;color:#A5D6FF;border:none windowtext 1.0pt;padding:0cm">"Enter your name:"</span><code><span style="border:none windowtext 1.0pt;padding:0cm">);</span></code><o:p></o:p></pre>
        <pre style="vertical-align:baseline"><span style="font-family:"inherit",serif;color:#FF7B72;border:none windowtext 1.0pt;padding:0cm">String</span><code><span style="border:none windowtext 1.0pt;padding:0cm"> </span></code><span style="font-family:"inherit",serif;color:#79C0FF;border:none windowtext 1.0pt;padding:0cm">name</span><code><span style="border:none windowtext 1.0pt;padding:0cm"> </span></code><span style="font-family:"inherit",serif;color:#79C0FF;border:none windowtext 1.0pt;padding:0cm">=</span><code><span style="border:none windowtext 1.0pt;padding:0cm"> scanner.nextLine();</span></code><o:p></o:p></pre>
        <pre style="vertical-align:baseline"><code><span style="border:none windowtext 1.0pt;padding:0cm"> </span></code><o:p></o:p></pre>
        <pre style="vertical-align:baseline"><code><span style="border:none windowtext 1.0pt;padding:0cm">System.out.println(</span></code><span style="font-family:"inherit",serif;color:#A5D6FF;border:none windowtext 1.0pt;padding:0cm">"Hello "</span><code><span style="border:none windowtext 1.0pt;padding:0cm"> + name + </span></code><span style="font-family:"inherit",serif;color:#A5D6FF;border:none windowtext 1.0pt;padding:0cm">", you are "</span><code><span style="border:none windowtext 1.0pt;padding:0cm"> + age + </span></code><span style="font-family:"inherit",serif;color:#A5D6FF;border:none windowtext 1.0pt;padding:0cm">" years old"</span><code><span style="border:none windowtext 1.0pt;padding:0cm">);</span></code><o:p></o:p></pre>
        <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><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>
        <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
        <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
        <p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">On
          Thu, Nov 7, 2024, 11:36 AM Kenneth Fogel <<a href="mailto:kfogel@dawsoncollege.qc.ca" target="_blank" moz-do-not-send="true" class="moz-txt-link-freetext">kfogel@dawsoncollege.qc.ca</a>>
          wrote:<o:p></o:p></p>
        <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>
        <p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
        <p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
        <p class="MsoNormal"><span lang="EN-US"><o:p> </o:p></span></p>
        <p class="MsoNormal"><o:p> </o:p></p>
      </div>
    </blockquote>
    <br>
  </body>
</html>