首页 > 解决方案 > 在特定行中附加java中的文件

问题描述

我想为 html 语言创建一些新的编译器,就像我打字时一样

<repeat it="5">
<input type="text" name="user">
</repeat>

它将重复输入行5次并将其写入文件并删除最后3行并将其替换为: 5输入 所以我的问题是当我替换这些行并将其写入文件时netbean的编译器显示给我此错误消息:

 Exception in thread "AWT-EventQueue-0" java.util.NoSuchElementException: No line found
    at java.util.Scanner.nextLine(Scanner.java:1540)
    at htmleditor.editfr.boomActionPerformed(editfr.java:145)
    at htmleditor.editfr.access$100(editfr.java:28)
    at htmleditor.editfr$2.actionPerformed(editfr.java:72)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
    at java.awt.Component.processMouseEvent(Component.java:6539)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
    at java.awt.Component.processEvent(Component.java:6304)
    at java.awt.Container.processEvent(Container.java:2239)
    at java.awt.Component.dispatchEventImpl(Component.java:4889)
    at java.awt.Container.dispatchEventImpl(Container.java:2297)
    at java.awt.Component.dispatchEvent(Component.java:4711)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4904)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4535)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4476)
    at java.awt.Container.dispatchEventImpl(Container.java:2283)
    at java.awt.Window.dispatchEventImpl(Window.java:2746)
    at java.awt.Component.dispatchEvent(Component.java:4711)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:760)
    at java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:709)
    at java.awt.EventQueue$3.run(EventQueue.java:703)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:84)
    at java.awt.EventQueue$4.run(EventQueue.java:733)
    at java.awt.EventQueue$4.run(EventQueue.java:731)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:730)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

代码 :

private void boomActionPerformed(java.awt.event.ActionEvent evt) {                                     
    // TODO add your handling code here:
     String p = name.getText()+".html";
     int iteranum = 0;
     String linetow;
     String word = null;
    Scanner scan = null;
    try {
        scan = new Scanner(new File(p));
    } catch (FileNotFoundException ex) {
        Logger.getLogger(editfr.class.getName()).log(Level.SEVERE, null, ex);
    }
    while(scan.hasNext()){
        String line = scan.nextLine().toLowerCase().toString();
        if(line.contains("<repeat")){
            int i= line.indexOf("it=")+4;
            char itera = line.charAt(i);
            iteranum=Integer.parseInt(String.valueOf(itera));  
        }
         linetow = scan.nextLine().toLowerCase().toString();

         System.out.println(p);
        for(int j=1;j<=iteranum;j++){
            //begin

        line = line.replace(line, linetow);
        try {

Files.write(Paths.get(p), line.getBytes(), StandardOpenOption.APPEND);
     }
        catch (IOException e) {
//exception handling left as an exercise for the reader
    }
            //end
        }
    }
}                                    

标签: java

解决方案


原因是scan.nextLine()调用后调用了两次scan.hasNext()

    while(scan.hasNext()){
        String line = scan.nextLine().toLowerCase().toString(); // next line always exists
        ...
        linetow = scan.nextLine().toLowerCase().toString(); // next line does not always exist

因此,如果您在 html 文件中添加或删除一行,则NoSuchElementException不会抛出。但是,您应该将代码更改为在调用scan.nextLine()后仅调用一次scan.hasNext()


推荐阅读