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

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

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

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Java

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

ファイルI/O

ファイルI/Oは、コンピューターにおけるファイルの入出力です。これは生成/削除やファイルを読み込んだり、出力をファイルに書き込むようなディレクトリやファイルの運用を含みます。

Q&A

解決済

1回答

656閲覧

Java (java.lang.OutOfMemoryErrorの原因)

hankechi78

総合スコア8

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Java

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

ファイルI/O

ファイルI/Oは、コンピューターにおけるファイルの入出力です。これは生成/削除やファイルを読み込んだり、出力をファイルに書き込むようなディレクトリやファイルの運用を含みます。

0グッド

0クリップ

投稿2020/11/06 00:03

前提・実現したいこと

ローマ字(仏語)の文章を単語に区切るプログラムを作成中、以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at java.base/java.lang.StringLatin1.newString(StringLatin1.java:764) at java.base/java.lang.String.substring(String.java:1908) at structuredonnées/langueIdentifier.Test.main(Test.java:33)

該当のソースコード

Java

1 2package langueIdentifier; 3 4import java.io.BufferedReader; 5import java.io.IOException; 6import java.nio.charset.Charset; 7import java.nio.file.Files; 8import java.nio.file.Path; 9import java.nio.file.Paths; 10import java.text.BreakIterator; 11import java.util.ArrayList; 12 13public class Test { 14 15private String textFile; 16 17public Test (String textFile) { 18 19this.textFile = textFile; 20 } 21 22public static void main(String[] args) { 23Path p1 = Paths.get("path"); 24Charset charset = Charset.forName("UTF-8"); 25ArrayList<String> mots = new ArrayList<String>(); 26 27try (BufferedReader reader = Files.newBufferedReader(p1, charset)){ 28String line = reader.readLine(); 29BreakIterator wb = BreakIterator.getWordInstance(); 30 31while (line != null) { 32wb.setText(line); 33int lastIndex = wb.first(); 34while (BreakIterator.DONE != lastIndex) { 35int firstIndex = lastIndex; 36lastIndex = wb.next(); 37if (lastIndex != wb.DONE && Character.isLetterOrDigit(line.charAt(firstIndex))) { 38String mot = line.substring(firstIndex, lastIndex).toLowerCase(); 39mots.add(mot); 40} 41 42} 43 44} 45} catch (IOException ioe) { 46 47System.out.println(ioe.toString()); 48} 49for (String mot : mots) { 50 51System.out.println(mot); 52} 53} 54} 55

試したこと

ネットでも調べてみましたがよくわかりませんでした。問題のテキストファイルは大したサイズのファイルでもなく、もう少し重いテキストファイルを読み込む他のプログラムは正常に作動しているので、不可解です。

よろしくお願いします。

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

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

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

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

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

m.ts10806

2020/11/06 00:05

無限ループでは。デバッグしてみましたか?
guest

回答1

0

ベストアンサー

java

1while (line != null) { 2 wb.setText(line); 3 int lastIndex = wb.first(); 4 while (BreakIterator.DONE != lastIndex) { 5 int firstIndex = lastIndex; 6 lastIndex = wb.next(); 7 if (lastIndex != wb.DONE && Character.isLetterOrDigit(line.charAt(firstIndex))) { 8 String mot = line.substring(firstIndex, lastIndex).toLowerCase(); 9 mots.add(mot); 10 } 11 12 } 13 14}

このループ内で、lineを書き換える場所は1つもありません(そして、ループ内に入出力処理はないので、IOExceptionも起きません)。結果、一度このループに入れば抜け出すルートのない無限ループとなります。

投稿2020/11/06 00:06

maisumakun

総合スコア145183

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

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

hankechi78

2020/11/06 08:28

早速のご回答ありがとうございます! line = reader.readLine()を忘れていたので追加したところ正常に作動しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問