尝试读取布尔输入时,Scanner InputMismatchException错误

时间:2015-09-27 15:31:45

标签: java java.util.scanner

我在下面的Java代码中使用<android.support.design.widget.AppBarLayout android:id="@+id/app_bar_layout" android:layout_width="match_parent" android:layout_height="240dp" android:fitsSystemWindows="true" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> <android.support.design.widget.CollapsingToolbarLayout android:id="@+id/collapsing_toolbar" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" app:contentScrim="#FF4548" app:expandedTitleMarginEnd="64dp" app:expandedTitleMarginStart="48dp" app:layout_scrollFlags="scroll|exitUntilCollapsed"> <RelativeLayout android:id="@+id/slidelayout" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingTop="?attr/actionBarSize" android:background="#fff"> <android.support.v4.view.ViewPager android:id="@+id/pager" android:layout_width="match_parent" android:layout_height="match_parent" /> <com.viewpagerindicator.CirclePageIndicator android:id="@+id/indicator" android:layout_width="fill_parent" android:layout_height="10dp" android:layout_alignParentBottom="true" android:layout_marginBottom="7dp" /> </RelativeLayout> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" app:layout_collapseMode="pin" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" /> <RelativeLayout android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:paddingLeft="3dp" android:layout_gravity="top" android:paddingRight="3dp" app:layout_collapseMode="pin"> <ImageView android:id="@+id/imgsearch" android:layout_width="wrap_content" android:layout_height="?attr/actionBarSize" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_marginRight="2dp" android:paddingBottom="5dp" android:src="@drawable/ic_action_search" android:visibility="visible" /> <ImageView android:id="@+id/imgshare" android:layout_width="wrap_content" android:layout_height="?attr/actionBarSize" android:layout_alignParentTop="true" android:layout_marginLeft="5dp" android:layout_toRightOf="@+id/imgsearch" android:paddingBottom="5dp" android:src="@drawable/ic_action_share" android:visibility="visible" /> <ImageView android:id="@+id/imglike" android:layout_width="wrap_content" android:layout_height="?attr/actionBarSize" android:layout_alignParentTop="true" android:layout_marginLeft="5dp" android:layout_toRightOf="@+id/imgshare" android:paddingBottom="5dp" android:src="@drawable/ic_action_favorite" android:visibility="visible" /> <RelativeLayout android:id="@+id/sabadkharidslayout" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_toRightOf="@+id/imglike" android:visibility="gone"> <ImageView android:id="@+id/img_sabad" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginRight="10dp" android:src="@drawable/sabad" /> <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_marginBottom="15dp" android:layout_marginRight="10dp" android:background="@drawable/circle"> <TextView android:id="@+id/text_numkharid" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:gravity="right" android:includeFontPadding="false" android:singleLine="true" android:textColor="#fff" android:textSize="12sp" /> </RelativeLayout> </RelativeLayout> <ImageView android:id="@+id/back" android:layout_width="wrap_content" android:layout_height="?attr/actionBarSize" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:layout_marginRight="5dp" android:paddingBottom="5dp" android:rotationY="180" android:src="@drawable/ic_action_back" android:visibility="visible" /> <TextView android:id="@+id/textVieww1" android:layout_width="wrap_content" android:layout_height="?attr/actionBarSize" android:layout_marginRight="5dp" android:layout_toLeftOf="@+id/back" android:gravity="right|center_vertical" android:shadowColor="#eee" android:shadowDx="2" android:shadowDy="2" android:shadowRadius="4" android:singleLine="true" android:textColor="#fff" android:textSize="17sp" /> <AutoCompleteTextView android:id="@+id/editText1" android:layout_width="150dp" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginRight="10dp" android:layout_toLeftOf="@+id/textVieww1" android:layout_toRightOf="@+id/sabadkharidslayout" android:background="#fff" android:completionThreshold="1" android:dropDownWidth="match_parent" android:ems="10" android:singleLine="true" android:gravity="right" android:paddingBottom="5dp" android:paddingTop="5dp" android:textSize="12sp" android:visibility="gone"> <requestFocus /> </AutoCompleteTextView> </RelativeLayout> </android.support.design.widget.CollapsingToolbarLayout> </android.support.design.widget.AppBarLayout> 方法,我用readFile()实现了逐行读取文件并分成五个不同的对象,但是当它到达{ {1}}输入它会引发Scanner错误。是什么导致了这个错误?我尝试了一些不同的东西,我刚刚将boolean添加到导致此错误的扫描程序,但在使用分隔符之前,它没有关闭InputMismatchException。我做错了什么?

我的文件数据如下所示:

usedelimiter(",")

我的方法如下:

Scanner

这是完整的堆栈跟踪:

Chevy, Malibu, 1999, 10000, true,
Ford, Focus, 2001, 5000, false,
Porshe, Carrera, 1995, 35000, true,
Honda, Insight, 2014, 18000, true,
Hyundai, Elantra, 1998, 9000, true,
end

3 个答案:

答案 0 :(得分:1)

让我们看一下你文件的第一行:

  

Chevy,Malibu,1999,10000,true,

如您所见,最后一个字符是:, 现在让我们看看你的分隔符:scCars.useDelimiter(", ");。正如您所看到的,它需要逗号一个空格。因此,我们知道文件每一行的最后一个逗号是不是一个有效的分隔符。因此,扫描程序将显示true,(或false,)而不是true(或false)。

要解决此问题,请将分隔符更改为scCars.useDelimiter(",\\s*");以接受逗号和任意数量的空格。如果您不想拆分包含多个空格的文字,也可以使用scCars.useDelimiter(",\\s?");

Btw:你还有另一个问题:你没有正确处理最后一个文件行&#34; end&#34; ,但这是另一个问题。

答案 1 :(得分:1)

这种情况发生了,因为每行中的最后一部分只有,而不是,<whitespace>,您已在扫描仪分隔符中指定了这一部分。我建议你做出以下改动。

scCars.useDelimiter(",");

make = scCars.next().trim();
model = scCars.next().trim();
year = Integer.parseInt(scCars.next().trim());
price = Double.parseDouble(scCars.next().trim());
happy = Boolean.parseBoolean(scCars.next().trim());

您可以使用regex来处理它。处理零个或多个空格的正则表达式为,\\s*以及一个逗号。然后你只需要对你的分隔符进行一次转换。

scCars.useDelimiter(",\\s*");

答案 2 :(得分:0)

这是您的数据集格式和分隔符的问题。

您可以删除','之后的空格并使用

sc. useDelimiter(',');

只需确保您使用的分隔符,分隔的值具有您从扫描仪中询问的类型所需的精确格式

e.g。

sc.nextInt() must have an int to return
sc.nextBoolean() must have a boolean to return

在你的情况下 sc.nextBoolean() 正在工作,因为下一个值是'true,'这不是一个有效的布尔值< / p>