java
1import java.io.*; 2import java.util.*; 3import java.util.regex.*; 4 5public class Jfile { 6 //javaファイルを保存する 7 private File jfile; 8 9 //getStringメソッドに使用 10 //条件に合う文を格納するリスト 11 public ArrayList<String> list = new ArrayList<>(); 12 13 Jfile(File f) { 14 this.jfile = f; 15 } 16 17 //ファイル名を返す関数 18 public String getName() { 19 return this.jfile.getName(); 20 } 21 22 //パスを返す関数 23 public String getPath() { 24 return this.jfile.getAbsolutePath(); 25 } 26 27 //ファイルの行数を返す関数 28 public int getLineCount() { 29 int count = 0; //行数を数えるための変数 30 try { 31 //ファイルの中身を読み込む 32 FileReader fr = new FileReader(this.jfile); 33 BufferedReader br = new BufferedReader(fr); 34 35 while(br.readLine() != null) { 36 count++; 37 } 38 39 br.close(); 40 fr.close(); 41 } catch(IOException e) { 42 System.out.println(e); 43 } 44 return count; 45 } 46 47 //ファイルのクラス、パッケージ、importを返す関数 48 public String getString(String search_str) { 49 try { 50 //ファイルの中身を読み込む 51 FileReader fr = new FileReader(this.jfile); 52 BufferedReader br = new BufferedReader(fr); 53 54 //条件に合う行をリストに格納 55 String line; 56 while((line = br.readLine()) != null) { 57 Pattern p = Pattern.compile(search_str); 58 Matcher m = p.matcher(line); 59 60 if(m.find()) { 61 list.add(line); 62 } 63 } 64 65 br.close(); 66 fr.close(); 67 } catch(IOException ex) { 68 ex.printStackTrace(); 69 } 70 71 //リストの中身を一つの文にする。 72 String rt_line = ""; 73 74 while(list.size() != 0) { 75 rt_line += list.get(0) + " 、"; 76 list.remove(0); 77 } 78 79 return rt_line; 80 } 81} 82
java
1import java.io.*; 2import java.util.*; 3public class Main { 4 private static final String FILENAME = "file2.csv"; 5 6 public static void main(String[] args) { 7 8 //Javaファイルを保存するクラス 9 ArrayList<Jfile> javalist = new ArrayList<Jfile>(); 10 //中を探索するためのディレクトリを保存するリスト 11 ArrayList<File> ser_dir = new ArrayList<File>(); 12 13 //最初のディレクトリをinputに代入 14 Scanner s = new Scanner(System.in); 15 System.out.print("ディレクトリ名 → "); 16 String input = s.nextLine(); 17 18 s.close(); 19 20 File dir = new File(input); 21 ser_dir.add(dir); 22 23 while(ser_dir.size() != 0) { 24 File[] dirFilelist = ser_dir.get(0).listFiles(); 25 for(int i=0; i<dirFilelist.length; i++) { 26 String extension = ""; 27 String fileName = dirFilelist[i].getName(); 28 //ファイルの拡張子を取得 29 extension = fileName.substring(fileName.lastIndexOf(".")); 30 31 //ファイルがディレクトリなら中身を探索 32 if(dirFilelist[i].isDirectory()) { 33 ser_dir.add(new File(dirFilelist[i].getPath())); 34 35 } else if (extension == ".java") { //ファイル拡張子が.javaならjavalistに追加 36 javalist.add(new Jfile(dirFilelist[i])); 37 } 38 } 39 ser_dir.remove(0); 40 } 41 42 43 //csvファイルに書き込む 44 try(PrintWriter w = new PrintWriter(new BufferedWriter(new FileWriter(FILENAME)))){ 45 for(int i=0 ; i < javalist.size() ; i++){ 46 w.println(javalist.get(i).getPath() + "," + 47 javalist.get(i).getName() + "," + 48 javalist.get(i).getLineCount() + "," + 49 javalist.get(i).getString("class") + "," + 50 javalist.get(i).getString("package") + "," + 51 javalist.get(i).getString("import") 52 ); 53 } 54 }catch(IOException e){ 55 System.out.println(e); 56 } 57 } 58}
実行結果と表示されるエラーメッセージ
ディレクトリ名 → ディレクトリ1
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: begin -1, end 7, length 7
at java.base/java.lang.String.checkBoundsBeginEnd(String.java:3734)
at java.base/java.lang.String.substring(String.java:1903)
at java.base/java.lang.String.substring(String.java:1876)
at Main.main(Main.java:29)
試したこと
こちらのエラーについて調べました。配列のインデックスに不適切な値が入れられていると表示されるらしいです。今回はなぜ表示されているのか自分では解決できなかったので質問させていただきます。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/11/16 02:40