当前位置: 首页 > 知识库问答 >
问题:

Java扫描仪读取空格时出错

长孙诚
2023-03-14

我有麻烦更新一个变量的名称为一个对象使用扫描器。我提供一个菜单给用户,用户选择他的选择(更新名称),程序要求用户输入新的名称,扫描器读取system.in并更新变量的名称。唯一的问题是程序不能读取带有空格的字符串。例如:

while(i ==1 ) {
     System.out.printf("\n%s Properties Menu\n---------------\n1.Update Name\n2.Update Registration\n3.Update Transponder\n4.Update Capacity\n5.Update Length\n6.Update Beam\n7.Update Draft\n8.Update Longitude and Latitude\n9.Update Cargo\n10.Display the Ship\n11.Previous Menu\n",shipArrayList.get(decision).getShipName());
     shipProperties = myScanner.nextInt();  // error line 121 here
     if(shipProperties == 1) {
          System.out.print("\nEnter a new name :");
          newString = myScanner.next();     // or nextLine():    
          shipArrayList.get(decision).setShipName(newString);
     }

如果键入类似tdog的内容,则可以执行此操作,但如果键入tdog,则将得到java.util.InputMisMatchException,输出示例如下

Enter a new name :t dog

t Properties Menu
---------------
1.Update Name
2.Update Registration
3.Update Transponder
4.Update Capacity
5.Update Length
6.Update Beam
7.Update Draft
8.Update Longitude and Latitude
9.Update Cargo
10.Display the Ship
Exception in thread "main" java.util.InputMismatchException
    at java.util.Scanner.throwFor(Scanner.java:864)
11.Previous Menu
    at java.util.Scanner.next(Scanner.java:1485)
    at java.util.Scanner.nextInt(Scanner.java:2117)
    at java.util.Scanner.nextInt(Scanner.java:2076)
    at main.Map.updateShip(Map.java:121)
    at main.main.main(main.java:48)
Java Result: 1

所以我猜它只读取t,当扫描器扫描shipProperty值时,它读取dog而不是等待输入。我读过关于nextline()的文章,但它跳过了整个用户输入部分,例如,将newstring=myscanner.next()切换为newstring=myscanner.nextline()输出....

DarkGoat Properties Menu
---------------
1.Update Name
2.Update Registration
3.Update Transponder
4.Update Capacity
5.Update Length
6.Update Beam
7.Update Draft
8.Update Longitude and Latitude
9.Update Cargo
10.Display the Ship
11.Previous Menu
1                           //i enter 1 to update name

Enter a new name :          //skips name input and waits for property input
 Properties Menu
---------------
1.Update Name
2.Update Registration
3.Update Transponder
4.Update Capacity
5.Update Length
6.Update Beam
7.Update Draft
8.Update Longitude and Latitude
9.Update Cargo
10.Display the Ship
11.Previous Menu

所以我的问题是如何让扫描器接受以空格作为有效字符串的输入。

共有1个答案

柳和怡
2023-03-14

next读取一个单词。如果要读取整行(直到用户按下ENTER键),请使用nextline

您会得到异常,因为next调用读取并返回“t”,而“dog”将留给下一个调用--下一个调用恰好是nextint,因为“dog”不是int而失败。

 类似资料:
  • 我正在帮助我的姐妹们编写一个简单的java程序,我被难倒了。他们只学习了扫描器类来读取文件内容,所以我认为他们应该使用扫描器类。每一行都包含字母和可能的空格,我们希望将每一行存储在一个数组中。在其中一行包含以下内容之前,此操作非常有效: abcde f(f后的空格应作为行的一部分读入)。 但是,似乎忽略了最后一个空格。我想我可以将扫描仪定界符设置为如下: 然后使用,但这似乎仍然不起作用。我在谷歌上

  • 问题内容: 编辑 以便进一步阅读:问题是我的输入文件已损坏。 我不明白我在做什么错: 我正在使用此代码: 哪个工作正常。现在,由于某种原因,我想换一个扫描仪。我的代码变成: 这次,我们从不输入while,因为r.hasNextLine()始终返回“ false”。关于我在做什么错的任何想法吗? 我精确地说,没有其他更改,文件仍然相同。 编辑 :我还精确地我尝试了另一个文件,并得到相同的结果,这意味

  • 问题内容: 我正在玩Scanner类,以进行学习,并且我使用它来读取非常大的文件(大约60.000行,大约不使用Reader类),并且在大约400行后停止读取。我是否必须在Scanner的构造函数中使用Bufferedreader还是问题?我想知道为什么会这样。谢谢。我的代码是输出所有行的常用代码。 问题答案: 此问题通常在64位计算机上或文件大小大于1-2 GB的文件中更常见,并且与堆空间无关。

  • 问题内容: 我正在尝试做的是拥有多个具有不同变量的输入。每个变量将是不同方程式的一部分。我正在寻找一种方法来做,我想我有一个主意。我只想知道这是否合法,也许还有更好的方法。 问题答案: 如果每个输入都问相同的问题,则应使用循环和输入数组: 或者如Chip所建议的,您可以从一行中解析输入: 您在正确的轨道上,所做的工作正常。这只是一种更好,更灵活的处理方式。

  • 问题内容: Go扫描程序包中使用技巧来查找空白: 然后: 由于字符值向左移超过31,因此在某些情况下这不是唯一的吗?我的意思是,当某些char与制表符模数32相同时,它将被识别为空格吗? 问题答案: 完全答案: Spec明确表示,对于无符号操作,我们会屏蔽掉高位,因此低位实际上是“环绕”的。 它起作用的原因是: 实际上是完全适合的价值 在运行时对无符号整数进行的运算可以具有任意大的中间值,并且会回

  • 问题内容: 我已读过只能为int类型的用户输入,当用户输入字母而不是int时出现问题。我知道如何处理该异常,但是我想在用户犯错的地方返回扫描仪读取的信息。我能怎么做?我已经尝试过无限循环,但是它不起作用。 问题答案: 尽管其他答案为您提供了使用循环的正确思路,但您应避免将异常用作基本逻辑的一部分。相反,您可以使用from 检查用户是否传递了整数。