【问题标题】:Android NoSuchElementException and ScannerAndroid NoSuchElementException 和扫描器
【发布时间】:2013-02-21 12:10:59
【问题描述】:

我正在尝试通过从原始文件夹中读取一个 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()));

我可以在每次迭代中看到向量变量,但是当它完成填充某些东西时会杀死我的活动...

我就是不明白出了什么问题,这就是我寻求帮助的原因!

提前谢谢你!

【问题讨论】:

  • 我不是 100% 确定,但问题出在 Log.d("clicked" , sc.nextLine()); 行上。即使没有数据,它也会调用 nextLine() 函数。

标签: java android parsing java.util.scanner


【解决方案1】:

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

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

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

然后,在这一行:

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

您在已经结束的输入上调用nextLine()。根据Scanner.nextLine()的文档:

投掷:

NoSuchElementException - 如果没有找到行

此调用导致Scanner 抛出NoSuchElementException。只需删除 Log.d() 行 - 或记住循环中的最后一个元素,然后将其值记录到 LogCat(如果这是您的意图)。

【讨论】:

  • 谢谢!具有讽刺意味的是 Log.d() 应该帮助我监控我的代码。我感到愚蠢和感激......!!
  • 完全正确:D 很高兴你解决了那个问题。拥抱这一刻的感觉(和乐趣)阅读:en.wikipedia.org/wiki/Heisenbug 注意:这个词不适用于您的情况,但具有类似的生活讽刺;)
  • 真实故事!感觉被拥抱了!
【解决方案2】:

在您的while-loop 之后,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)

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

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

【讨论】:

    【解决方案3】:

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

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

    日志中有趣的部分;

    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): 在 java.util.Scanner.nextLine(Scanner.java:1417) 02-21 14:04:35.619: E/AndroidRuntime(19925):在 com.soulmagnet.speakerparametrix2.PlotInfBaffle.plotSPLinfBaffle(PlotInfBaffle.java:136) 02-21 14:04:35.619: E/AndroidRuntime(19925): ... 14 更多

    Scanner 的文档说当没有新行时会抛出这个异常。

    这是你的问题

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-04
      • 1970-01-01
      • 2015-09-06
      • 1970-01-01
      • 1970-01-01
      • 2022-12-03
      相关资源
      最近更新 更多