Android NoSuchElementException和Scanner

时间:2013-02-21 12:10:59

标签: java android parsing java.util.scanner

我正在尝试通过从原始文件夹中读取txt文件为我的应用创建一个整数数组。 txt包含每行的编号,如下所示:

的test.txt

1
3
4
5
6
2
-9
...

我的数组应该像Integer[] vector = {1,2,3,4,5,6,2,-9,...}

一样

我正在解释的代码(实际上是在单击回调方法中):

public void plotSPLinfBaffle(View v) {
    List<Integer> vector = new ArrayList<Integer>();

    InputStream in = getResources().openRawResource(R.raw.test);
    Scanner sc = new Scanner(new InputStreamReader(in));

    while(sc.hasNext()){

        vector.add(Integer.parseInt(sc.nextLine()));
    }

    Log.d("clicked" , sc.nextLine());

    Integer[] splVector = vector.toArray(new Integer[0]);
}

你看,我一直得到这个运行时错误和logcat消息:

02-21 14:04:35.599: D/AndroidRuntime(19925): Shutting down VM
02-21 14:04:35.599: W/dalvikvm(19925): threadid=1: thread exiting with uncaught exception (group=0x40018578)
02-21 14:04:35.619: E/AndroidRuntime(19925): FATAL EXCEPTION: main
02-21 14:04:35.619: E/AndroidRuntime(19925): java.lang.IllegalStateException: Could not execute method of the activity
02-21 14:04:35.619: E/AndroidRuntime(19925):    at android.view.View$1.onClick(View.java:2144)
02-21 14:04:35.619: E/AndroidRuntime(19925):    at android.view.View.performClick(View.java:2485)
02-21 14:04:35.619: E/AndroidRuntime(19925):    at android.view.View$PerformClick.run(View.java:9080)
02-21 14:04:35.619: E/AndroidRuntime(19925):    at android.os.Handler.handleCallback(Handler.java:587)
02-21 14:04:35.619: E/AndroidRuntime(19925):    at android.os.Handler.dispatchMessage(Handler.java:92)
02-21 14:04:35.619: E/AndroidRuntime(19925):    at android.os.Looper.loop(Looper.java:130)
02-21 14:04:35.619: E/AndroidRuntime(19925):    at android.app.ActivityThread.main(ActivityThread.java:3687)
02-21 14:04:35.619: E/AndroidRuntime(19925):    at java.lang.reflect.Method.invokeNative(Native Method)
02-21 14:04:35.619: E/AndroidRuntime(19925):    at java.lang.reflect.Method.invoke(Method.java:507)
02-21 14:04:35.619: E/AndroidRuntime(19925):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
02-21 14:04:35.619: E/AndroidRuntime(19925):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
02-21 14:04:35.619: E/AndroidRuntime(19925):    at dalvik.system.NativeStart.main(Native Method)
02-21 14:04:35.619: E/AndroidRuntime(19925): Caused by: java.lang.reflect.InvocationTargetException
02-21 14:04:35.619: E/AndroidRuntime(19925):    at java.lang.reflect.Method.invokeNative(Native Method)
02-21 14:04:35.619: E/AndroidRuntime(19925):    at java.lang.reflect.Method.invoke(Method.java:507)
02-21 14:04:35.619: E/AndroidRuntime(19925):    at android.view.View$1.onClick(View.java:2139)
02-21 14:04:35.619: E/AndroidRuntime(19925):    ... 11 more
02-21 14:04:35.619: E/AndroidRuntime(19925): Caused by: java.util.NoSuchElementException
02-21 14:04:35.619: E/AndroidRuntime(19925):    at java.util.Scanner.nextLine(Scanner.java:1417)
02-21 14:04:35.619: E/AndroidRuntime(19925):    at com.soulmagnet.speakerparametrix2.PlotInfBaffle.plotSPLinfBaffle(PlotInfBaffle.java:136)
02-21 14:04:35.619: E/AndroidRuntime(19925):    ... 14 more

仍然,在调试模式下放置断点:

  

22 vector.add(Integer.parseInt(sc.nextLine()));

我可以在每个iterration中看到vector变量,但是当它完成填充时会触发我的活动......

我无法理解什么是错的,这就是我寻求帮助的原因!

提前谢谢!

3 个答案:

答案 0 :(得分:3)

仔细查看堆栈跟踪并查看Scanner.nextLine()方法的文档。

你正在吃这个循环中输入文件中的所有行:

while (sc.hasNext()) {
    vector.add(Integer.parseInt(sc.nextLine()));
}

然而,在这一行:

Log.d("clicked" , sc.nextLine());

您在已经结束的输入上调用nextLine()。根据{{​​1}}的文档:

  

抛出:

     

NoSuchElementException - 如果没有找到行

此调用会导致Scanner.nextLine()抛出Scanner。简单地删除NoSuchElementException行 - 或者记住循环中的最后一个元素,然后将其值记录到LogCat(如果这是你的意图)。

答案 1 :(得分:2)

while - 循环之后,sc不再包含行(因此循环退出)。

稍后你有

 Log.d("clicked" , sc.nextLine());

这会尝试抓住另一条线(不再存在),导致错误:

E/AndroidRuntime(19925): Caused by: java.util.NoSuchElementException
E/AndroidRuntime(19925):    at java.util.Scanner.nextLine(Scanner.java:1417)
E/AndroidRuntime(19925):    at com.soulmagnet.speakerparametrix2.PlotInfBaffle.plotSPLinfBaffle(PlotInfBaffle.java:136)

(有些隐藏在完整的错误日志中)

因此,删除该行,它应该可以正常工作。

答案 2 :(得分:0)

您是否在日志中看到“已点击”?

如果可以的话,在此日志打印之前一切都很好。

日志中有趣的部分;

  

14:04:35.619:E / AndroidRuntime(19925):... 11更多02-21 14:04:35.619:   E / AndroidRuntime(19925):引起:java.util.NoSuchElementException   02-21 14:04:35.619: E / AndroidRuntime(19925):at    java.util.Scanner.nextLine (Scanner.java:1417)02-21 14:04:35.619:   E / AndroidRuntime(19925):at   com.soulmagnet.speakerparametrix2.PlotInfBaffle.plotSPLinfBaffle(PlotInfBaffle.java:136)   02-21 14:04:35.619:E / AndroidRuntime(19925):... 14更多

Scanner的文档说没有换行时会抛出此异常。

这是你的问题

Log.d("clicked" , sc.nextLine());