質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

3600閲覧

java.lang.StringIndexOutOfBoundsExceptioの意味が分からない。

K.M.PEANUTS

総合スコア40

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2021/11/15 14:36

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)

試したこと
こちらのエラーについて調べました。配列のインデックスに不適切な値が入れられていると表示されるらしいです。今回はなぜ表示されているのか自分では解決できなかったので質問させていただきます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

java

1//ファイルの拡張子を取得 2extension = fileName.substring(fileName.lastIndexOf("."));

ここで fileName.substring()-1 を渡していて、例外が起きています。-1 を渡さないようにしなければなりません。fileName. が含まれていない場合は何をしたいのかを考えましょう。

投稿2021/11/15 15:00

int32_t

総合スコア20856

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

K.M.PEANUTS

2021/11/16 02:40

理解できました! ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問