Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 获得无接触异常_Java_File Io_Bufferedreader - Fatal编程技术网

Java 获得无接触异常

Java 获得无接触异常,java,file-io,bufferedreader,Java,File Io,Bufferedreader,我正在尝试做一个应用程序,应该有助于使地下城和龙的项目更容易为用户 我有3个不同武器的列表,具有不同的统计数据等。其中2个列表添加到程序中很好,但其中1个抛出NoSuchElementException。我真的不明白为什么,因为我找不到与我得到的其他列表有什么不同的地方 列表中的一行如下所示: Light Melee Weapon,1d4,1d6,x2,10 ft.,Slashing,Axe (Throwing),8 gp, 2lb. 如果要查看,请链接到导致问题的整个列表 还可以链接到一个

我正在尝试做一个应用程序,应该有助于使地下城和龙的项目更容易为用户

我有3个不同武器的列表,具有不同的统计数据等。其中2个列表添加到程序中很好,但其中1个抛出NoSuchElementException。我真的不明白为什么,因为我找不到与我得到的其他列表有什么不同的地方

列表中的一行如下所示:

 Light Melee Weapon,1d4,1d6,x2,10 ft.,Slashing,Axe (Throwing),8 gp, 2lb.
如果要查看,请链接到导致问题的整个列表

还可以链接到一个工作正常的列表

我希望这个方法对你来说不会太长。我真的做了我能想到的一切来尝试解决这个问题。我敢肯定是列表导致了问题,因为只要我从它读取的目标中删除它,程序就会正常运行

它在工作的列表上可以很好地通过for循环,但是第一个列表不工作

Exception in thread "main" java.util.NoSuchElementException
at java.util.StringTokenizer.nextToken(StringTokenizer.java:349)
at MainGUI.init(MainGUI.java:60)
at MainGUI.main(MainGUI.java:32)

public HashMap<String,Weapon> init() {
    String path = "base";
    File folder = new File(path);
    File[] listOfFiles = folder.listFiles();
    if(listOfFiles.length == 0) {
        JOptionPane.showMessageDialog(MainGUI.this, "The folder \"base\" was empty"+
                " so no weapons or armor was attempted loaded.", "Warning",
                JOptionPane.WARNING_MESSAGE);
        return new HashMap<>();
    }
    HashMap<String, Weapon> weapons = new HashMap<>();
    BufferedReader r = null;
    for(File f : listOfFiles) {
        if(f.getName().endsWith(".txt")) {
            String line;
            try {
                r = new BufferedReader(new FileReader(f));
                while((line = r.readLine()) != null) {
                    Weapon w;
                    StringTokenizer st = new StringTokenizer(line,",");
                    while(st.hasMoreTokens()) {

                        w = new Weapon(WeaponCategory.fromString(st.nextToken()),
                                st.nextToken(),st.nextToken(),st.nextToken(),
                                st.nextToken(),st.nextToken(),st.nextToken(),
                                st.nextToken(),st.nextToken());
                        weapons.put(w.getName(), w);
                    }
                }
            } catch(FileNotFoundException fnfe) {
                JOptionPane.showMessageDialog(MainGUI.this, "The File "+
                    f.getName() + " was not found.", "Error",
                    JOptionPane.ERROR_MESSAGE);
            } catch(IOException ioe) {
                JOptionPane.showMessageDialog(MainGUI.this, "There was a problem reading "+
                        f.getName() + ".", "Error",
                        JOptionPane.ERROR_MESSAGE);
            }
        }
    }
    try {
        r.close();
    } catch (IOException ex) {
        JOptionPane.showMessageDialog(MainGUI.this, "An error occured while"
                + "closing the File Reader Stream:\n"+ex.getMessage(),
                "Error", JOptionPane.ERROR_MESSAGE);
    }
    return weapons;
}
线程“main”java.util.NoSuchElementException中的异常 位于java.util.StringTokenizer.nextToken(StringTokenizer.java:349) 位于MainGUI.init(MainGUI.java:60) MainGUI.main(MainGUI.java:32) 公共HashMap init(){ 字符串path=“base”; 文件夹=新文件(路径); File[]listOfFiles=folder.listFiles(); if(listOfFiles.length==0){ JOptionPane.showMessageDialog(MainGUI.this,“文件夹\“base\”为空”+ “所以没有人试图装填武器或盔甲。”,“警告”, JOptionPane。警告消息); 返回新的HashMap(); } HashMap武器=新的HashMap(); BufferedReader r=null; 对于(文件f:listOfFiles){ if(f.getName().endsWith(“.txt”)){ 弦线; 试一试{ r=新的BufferedReader(新的文件读取器(f)); 而((line=r.readLine())!=null){ 武器w; StringTokenizer st=新的StringTokenizer(行,“,”); 而(st.hasMoreTokens()){ w=新武器(武器类别.fromString(st.nextToken()), st.nextToken(),st.nextToken(),st.nextToken(), st.nextToken(),st.nextToken(),st.nextToken(), 圣奈克特肯(),圣奈克特肯()); put(w.getName(),w); } } }捕获(FileNotFoundException fnfe){ showMessageDialog(MainGUI.this,“文件”+ f、 找不到getName()+,“错误”, JOptionPane.ERROR\u消息); }捕获(ioe异常ioe){ showMessageDialog(MainGUI.this)“读取时出现问题”+ f、 getName()+“,”错误“, JOptionPane.ERROR\u消息); } } } 试一试{ r、 close(); }捕获(IOEX异常){ JOptionPane.showMessageDialog(MainGUI.this)表示,“在运行时发生错误” +“正在关闭文件读取器流:\n”+ex.getMessage(), “错误”,作业窗格。错误消息); } 归还武器; } 像这样编码

                while(st.hasMoreTokens()) {

                    w = new Weapon(WeaponCategory.fromString(st.nextToken()),
                            st.nextToken(),st.nextToken(),st.nextToken(),
                            st.nextToken(),st.nextToken(),st.nextToken(),
                            st.nextToken(),st.nextToken());
                    weapons.put(w.getName(), w);
                }
是不安全的,因为您假设每个输入行中有9项。您应该检查项目的数量,并优雅地处理无效行(例如,写出行的内容以便于识别问题)


实现这一点的一个简单方法是使用
String.split()
标记行。它返回一个
字符串[]
,您可以在尝试访问其元素之前轻松检查其大小。

Stringtokenizer现在有点老派

如果您确定不会有包含逗号的条目,则可以使用Scanner或只使用逗号拆分

如果使用split,则可以检查零件中的条目数量是否包含正确数量的元素:

 String[] parts = line.split(",")
 if (parts.length != 9){
   throw new RuntimeException("Bad line : " + line);
 }
 ...
 //continue processing 

您还可以在每一行上增加一个计数器,然后显示导致异常的行

如果输入耗尽,则由于某些原因而发生NoTouchElementException,这在标准输入中不太可能发生(它将被阻塞)。不正确的值将产生InputMismatchException

如果没有任何数据类型检查,那么不用担心。但如果您想拥有不同的数据类型,那么应该在添加到bean对象之前进行检查。

简单地尝试一下

    String splitString = "Hi! Amazing! wonderful!"
    for (String token : splitString.split("!")) {
        System.out.println(token.toString());
    }
  • 结果:

       Hi!
       Amazing!
       wonderful!
    

添加System.out.println(行)以确定哪一行导致问题。然后关闭每一个读卡器,而不仅仅是最后一个。当它到达特定的文件时,它就会停止。那又怎样?是什么阻止你把这句话写进System.out?把你的评论写进一个答案,我会接受的。它并没有真正解决我的整个问题,但它让我自己找到了解决方案。有一行字打错了。不过非常感谢!:你的名单第13行缺少一个标记。是的,我应该。这是一个快速的原型,所以我没有做太多。谢谢你的反馈。我已经接受了你的答案,但这不是真正的原因。然而,值得注意的是,我应该按照你的建议去做。如果您想知道解决方案,请查看我问题的注释。@Vipar,严格来说,是的,根本原因是该文件中的无效行。但是,正确编写的程序应该优雅地处理此类情况,显示正确的错误消息,其中包含在输入文件中查找和修复错误所需的所有信息。所以从这个意义上说,问题的原因确实是代码中的一个bug。该计划按设想的那样进行。它没有虫子。有一个bug的东西是输入文件。我同意,这个程序没有办法处理这个问题,但这不是一个bug。老兄,这个问题是在2012年发布的