2014-06-19 44 views
1

我已经搜索了有关该主题的各种主题,但无法找到处于相同情况或目前可以使用的任何解决方案。线程“main”中的Java异常java.util.NoSuchElementException - 使用扫描器读取文件

我只是想读取格式的TXT文件: Double0 Double0中断0 Double1 Double1 INT1 .. Doublen Doublen内置内置

这里是我的代码:

public void readDatabase(String s) throws FileNotFoundException{  
    try {    
      BufferedReader br = new BufferedReader(new FileReader(s)); 
      String line = br.readLine(); 
      Scanner trainFile = null; 
      while (line != null) {  
       line.trim(); 
       trainFile = new Scanner(line); 
       double x = trainFile.nextDouble(); 
       double y = trainFile.nextDouble(); 
       int type = trainFile.nextInt(); 
       this.database.add(new Point(x,y,type)); 
       line = br.readLine(); 
      } 
      trainFile.close(); 
      br.close(); 
    } 
    catch (IOException ioe) { 
     ioe.printStackTrace(); 
    } 
} 

有趣事情是这个函数工作了一段时间,但当我填充更多的数据txt文件停止工作。我也检查了文件最终的错误,但一切都很好。根据我的堆栈跟踪,该错误出现在第一个NextDouble()调用中。有没有人有一个想法?

更新:

这里是工作的文件类型:

0,6580097206539348 0,36101701387184226 2 
0,9529350156283241 0,7383387609711926 2 
0,6580097206539348 0,36101701387184226 2 
0,9529350156283241 0,7383387609711926 2 
0,6580097206539348 0,36101701387184226 2 
0,48639272096486486 0,4378985495387871 1 

但是,如果我添加一些额外的线条像这样将停止工作:

0,6580097206539348 0,36101701387184226 2 
0,9529350156283241 0,7383387609711926 2 
0,6580097206539348 0,36101701387184226 2 
0,9529350156283241 0,7383387609711926 2 
0,6580097206539348 0,36101701387184226 2 
0,48639272096486486 0,4378985495387871 1 
0,8632344357711337 0,5253407956535258 1 
0,7351912765040557 0,8295830810436339 1 
0,6369155743204543 0,2757349130759706 1 
0,46512947234632146 0,4388586141249502 1 
0,8677892876429869 0,599451235810409 1 
0,8827084731154641 0,55652107505414 1 
+1

为了帮助他人回答,你还需要分享你的文件。 –

+0

很可能是输入文件结构的问题。检查不正确的换行字符或共享文件内容 – Bobz79

+0

另一个额外的信息: 我有以下文件: 0,6580097206539348 \t 0,36101701387184226 0,9529350156283241 \t 0,7383387609711926 0,6580097206539348 \t 0, 36101701387184226 0,9529350156283241 \t \t 0,7383387609711926 2 0,6580097206539348 \t \t 0,36101701387184226 2 0,48639272096486486 \t \t 0,4378985495387871 1 和我的代码工作, 当我在EOF 0,8632344357711337 \t 0,5253407956535258 它引发错误添加下面的新行。 –

回答

0

下一个输入应该是总是是双倍的吧?因此,而不是while(line != null)(当你有一个空行,这将返回true)检查while(scanner.hasNextDouble())

public void readDatabase(String s) throws FileNotFoundException{  
    try {    
     final BufferedReader br = new BufferedReader(new FileReader(s)); 
     final Scanner trainFile = new Scanner(br); 
     while (trainFile.hasNextDouble()) {  
      double x = trainFile.nextDouble(); 
      double y = trainFile.nextDouble(); 
      int type = trainFile.nextInt(); 
      this.database.add(new Point(x,y,type)); 
     } 
     trainFile.close(); 
     br.close(); 
    } catch (IOException ioe) { 
     ioe.printStackTrace(); 
    } 
} 

你仍然需要逗号改为小数点。否则上述将不起作用。

如果你的文件有逗号,你需要把它解释为一个小数点,那么你可以尝试以下方法:

public void readDatabase(String s) throws FileNotFoundException{  
    try {    
     final BufferedReader br = new BufferedReader(new FileReader(s)); 
     String line = br.readLine(); 
     while(line != null) { 
      line = line.replace(',', '.'); 
      final Scanner lineScanner = new Scanner(line); 
      if(!scanner.hasNextDouble()) 
       break;// quit loop 
      // else continue loop 
      double x = lineScanner.nextDouble(); 
      double y = lineScanner.nextDouble(); 
      int type = lineScanner.nextInt(); 
      this.database.add(new Point(x,y,type)); 
      line = br.readLine(); 
     } 
     br.close(); 
    } catch (IOException ioe) { 
     ioe.printStackTrace(); 
    } 
} 
+0

您发布的第一个代码是唯一适用于我的解决方案。谢谢! –

+0

我不明白你如何设置JRE,以便将逗号解释为小数点。 – Jared

0

在java中,由于逗号代替了小数,因此无法解析双打。编辑文件以使用句点而不是逗号。

public static void readDatabase(String s) throws FileNotFoundException { 

    File file = new File(s); 
    Scanner scanner = new Scanner(file); 

    while (scanner.hasNextLine()) { 
     String line = scanner.nextLine(); 
     String[] values = line.split(" "); 
     double x = Double.parseDouble(values[0]); 
     double y = Double.parseDouble(values[1]); 
     int type = Integer.parseInt(values[2]); 
     System.out.println(x + " : " + y + " : " + type); 
    } 
    scanner.close(); 
} 

在文件:

我运行下面的功能测试的代码

1.1 1.2 1 
2.1 2.2 2 
3.1 3.2 3 

,并得到了结果:

1.1 : 1.2 : 1 
2.1 : 2.2 : 2 
3.1 : 3.2 : 3 

请注意,我的代码分离基于找到的空格,不使用扫描仪搜索双打/整数。在平面文件中,最好使用标准格式(空格,逗号,冒号等)而不是格式化文件,以便更容易解析文件。

编辑

如果你想保持你的平面文件的格式设置,因为它是简单地改变逗号期间将解决您的问题。我用你的函数(更改数据库线输出):

public static void readDatabase(String s) throws IOException { 

    BufferedReader br = new BufferedReader(new FileReader(s)); 
    String line = br.readLine(); 
    Scanner trainFile = null; 
    while (line != null) { 
     line.trim(); 
     trainFile = new Scanner(line); 
     double x = trainFile.nextDouble(); 
     double y = trainFile.nextDouble(); 
     int type = trainFile.nextInt(); 
     System.out.println(x + " : " + y + " : " + type); 
     line = br.readLine(); 
    } 
    trainFile.close(); 
    br.close(); 
} 

在文件(这是你给了,用逗号数据更改为周期):

0.6580097206539348 0.36101701387184226 2 
0.9529350156283241 0.7383387609711926 2 
0.6580097206539348 0.36101701387184226 2 
0.9529350156283241 0.7383387609711926 2 
0.6580097206539348 0.36101701387184226 2 
0.48639272096486486 0.4378985495387871 1 
0.8632344357711337 0.5253407956535258 1 
0.7351912765040557 0.8295830810436339 1 
0.6369155743204543 0.2757349130759706 1 
0.46512947234632146 0.4388586141249502 1 
0.8677892876429869 0.599451235810409 1 
0.8827084731154641 0.55652107505414 1 

和输出表现很好。

+0

好非常感谢您的帮助,但我的计算机上的神异原因: 它不具有点工作,但是当我更改为逗号它读取某些行 的你说在那里工作的相同代码在这里不能使用与ip相同的文件。 –

+1

你能给我更多关于你的开发环境的信息吗?你使用的是什么编译器,JDK版本,你使用的是什么操作系统? Java是独立的,因此无论您使用的计算机类型如何,它都应该可以工作。另外,你是否尝试使用我的代码和我发布的文件?这是一个通用的基本示例,就像一个概念验证,然后您可以查看主文件以查看错误的位置。 –

+0

嘿@Mike Elofson,使用您的代码,我设法使它正确打印。但是,当我尝试创建一个新的点内的函数添加到我的数据库 - > this.database.add(新点(x,y,类型));在保存3个变量之后,它说我不能在静态上下文中使用它。你对这个问题有什么建议吗? –

1

根据JavaDoc的nextDouble()扫描 输入的下一个令牌为一个double。这个方法会抛出InputMismatchException如果 下一个标记不能被转换成一个有效的double值。

所以这里Scanner无法找到Double你行0,6580097206539348 0,36101701387184226 2。还有一种解决方案是循环中只需更换,.(只有当你的每一个行不包含逗号不是为了这个目的除外)

FOR EXAMPLE

String yourLine="0,6580097206539348 0,36101701387184226 2" 
    Scanner trainFile = new Scanner(line.replace(',', '.')); 
       double x = trainFile.nextDouble(); 
       double y = trainFile.nextDouble(); 
       int type = trainFile.nextInt(); 

而且从Exception幸存您可以使用hasNextDoubel()hasNextInt()方法使扫描仪检查数据中是否存在double/int,它返回true/false。您可以在处阅读更多关于此的信息

相关问题