2

我的代码是读取文件并检查文件中的输入名称匹配数据。如果匹配则打印

我使用方法子字符串来检查它们是否匹配。我知道错误会出现在文件的第 1 行,因为第 1 行只有 4 个字符,所以 4<12 然后会出错。

那么如何跳过该错误并且程序仍然继续运行?我的意思是假设 4 小于 12 然后忽略,然后读取下一行直到读取所有行,如果匹配将打印它并程序结束。

谢谢你,对不起我的英语不好

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.logging.Level;
import java.util.logging.Logger;
String ss,sss;File file =new File("cauthu.dat");
        ss=JOptionPane.showInputDialog(null, "input name");
        FileReader fr;
        try {
            fr = new FileReader(file);
            BufferedReader br=new BufferedReader(fr);
            try {
                while((sss=br.readLine())!=null)
                {sss.substring(12);int l=sss.length();System.out.println(l);}
            } catch (IOException ex) {
                Logger.getLogger(Form7.class.getName()).log(Level.SEVERE, null, ex);
            }

`
        } catch (FileNotFoundException ex) {
            Logger.getLogger(Form7.class.getName()).log(Level.SEVERE, null, ex);
        }

这是文件中的数据:

Id:1
name:hello
Nam sinh:2000
Vi tri:thu mon
--------------------------
Id:2
name:hi
Nam sinh:2000
Vi tri:tien dao
--------------------------
Id:3
name:hello hi
Nam sinh:2000
Vi tri:tien dao
--------------------------

这是错误:

Exception in thread "AWT-EventQueue-1" java.lang.StringIndexOutOfBoundsException: String index out of range: -8
    at java.lang.String.substring(String.java:1931)
    at bai7.Form7.findActionPerformed(Form7.java:195)
    at bai7.Form7.access$100(Form7.java:23)
    at bai7.Form7$2.actionPerformed(Form7.java:73)
    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 org.GNOME.Accessibility.AtkWrapper$6.dispatchEvent(AtkWrapper.java:705)
    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)
4

5 回答 5

0

而不是使用substring()use sss.contains(ss),这将避免错误。


您可以通过首先阅读 4 行并从中创建合适类的实例来提高代码的可读性。然后用它做你的测试等。

于 2020-11-14T19:46:04.027 回答
0

为什么不直接使用Scanner和检索文件中找到的数据,逐步读取每个部分?您可以避免string split但使用Scanner自定义分隔符。

public static Map<Integer, Data> readDataFile(File file) throws FileNotFoundException {
    Map<Integer, Data> map = new HashMap<>();

    try (Scanner scan = new Scanner(file)) {
        scan.useDelimiter("[\n:]");

        while (scan.hasNext()) {
            scan.next();    // skip 'Id'
            int id = scan.nextInt();
            scan.next();    // sile 'name'
            String name = scan.next();
            scan.next();    // sile 'Nam sinh'
            int nameSinh = scan.nextInt();
            scan.next();    // sile 'Vi tri'
            String viTri = scan.next();

            if (map.put(id, new Data(id, name, nameSinh, viTri)) != null)
                throw new RuntimeException("'Id' duplication");

            scan.nextLine();
            scan.nextLine();    // skip '----'
        }
    }

    return map;
}

public final class Data {

    private final int id;
    private final String name;
    private final int nameSinh;
    private final String viTri;

    public Data(int id, String name, int nameSinh, String viTri) {
        this.id = id;
        this.name = name;
        this.nameSinh = nameSinh;
        this.viTri = viTri;
    }
}
于 2020-11-14T20:08:49.517 回答
0
  1. 既然你是StringIndexOutOfBoundsException通过 using得到的String#substring,你应该把sss.substring(12)它放在一个try-catch块内,因为你想简单地忽略错误,所以不要把任何代码放在catch块内。
  2. 您还应该确保关闭资源。一个好方法是使用try-with-resources语句。

演示:

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

import javax.swing.JOptionPane;

public class Main {
    public static void main(String[] args) throws FileNotFoundException, IOException {
        String ss, sss;
        ss = JOptionPane.showInputDialog(null, "input name");
        try (BufferedReader br = new BufferedReader(new FileReader("cauthu.dat"))) {
            while ((sss = br.readLine()) != null) {
                try {
                    sss.substring(12);
                    int l = sss.length();
                    System.out.println(l);
                } catch (Exception e) {
                    // Ignore
                }
            }
        }
    }
}

输出:

13
14
26
13
15
26
13
13
15
26
于 2020-11-14T12:42:02.777 回答
-1

嘿,如果你想跳到它,你可能会捕捉到异常这里是可以做的

public static void main(String []argh){
     String ss,sss;
     File file =new File("C:\\Users\\nishant.kumar\\Desktop\\input.dat");
     FileReader fr;
     try {
         fr = new FileReader(file);
         BufferedReader br=new BufferedReader(fr);
         try {
             while((sss=br.readLine())!=null)
             {
                 try {
                     sss.substring(12);
                     int l=sss.length();
                     System.out.println(l);
                 }
                 catch (StringIndexOutOfBoundsException ex) {
                     //System.out.println("Caught Exception");
                     continue;
                 }
             }
         } catch (IOException ex) {

         }
     } catch (FileNotFoundException ex) {

     }
 }

希望这有效。

于 2020-11-14T11:21:29.070 回答
-1

嘿,但这是工作..

public static void main(String []argh){
     String ss,sss;
     File file =new File("C:\\Users\\nishant.kumar\\Desktop\\input.dat");
     FileReader fr;
     try {
         fr = new FileReader(file);
         BufferedReader br=new BufferedReader(fr);
         try {
             while((sss=br.readLine())!=null)
             {
                 if(sss.length()>12) {
                     sss.substring(12);
                     int l=sss.length();
                     System.out.println(l);                      
                 }
             }
         } catch (IOException ex) {

         }
     } catch (FileNotFoundException ex) {

     }
 }
于 2020-11-14T11:43:18.797 回答