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

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

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

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

Q&A

解決済

2回答

657閲覧

java 例外処理後のメソッドの継続について

hanao_

総合スコア6

Java

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

0グッド

2クリップ

投稿2021/10/22 12:15

前提・実現したいこと

例外処理についての質問です。
指定したファイルから文字列や数値を読み込み、代入するメソッドを定義したいのですが、数値を読み込む際に一つ例外が生じてしまうと、その後は数値を読み込むことが出来ず、初期値の0となってしまいます。
繰り返しの中で、例外処理に引っかかった後もプログラムを実行したいのですが、やり方がわかりません、、、
調べてみたところ、try-catch文の外側に繰り返しの処理を書けば可能とのことなのですが、外側に出してもエラーが出てしまいます。どうしたらよいでしょうか、、、、

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

該当のソースコード

Java

1void readScores(String fname) { 2 try { 3 BufferedReader br=new BufferedReader(new FileReader(fname)); 4 String s,p[],r[]; 5 int i=0,k; 6 7 while((s=br.readLine()) !=null) { 8 9 if(i==0) { 10 subject=s.split("\s+"); 11 }else if(i==1) { 12 p=s.split("\s+"); 13 for(k=0;k<p.length;k++) { 14 int value=Integer.parseInt(p[k]); 15 setScore(k,value); 16 } 17 }else if(i==2) { 18 r=s.split("\s+"); 19 for(k=0;k<r.length;k++) { 20 int value=Integer.parseInt(r[k]); 21 setReportScore(k,value); 22 } 23 } 24 25 i++; 26 } 27 br.close(); 28 }catch(Exception e) { 29 System.out.println(e.getMessage()+"\n"); 30 } 31 }

試したこと

while((s=br.readLine()) !=null)の部分をtry-catch文の外側に出してみたのですが、unhandledやファイルが閉じられていないなどのエラーが出てしまい、どうすれば良いのかわかりません、、

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

BeatStar

2021/10/22 12:29

エラーメッセージぐらいは読みましょう。 エラーメッセージはコンパイラ等からのメッセージです。 ヒントが隠されています。
jimbe

2021/10/22 13:04

try{} catch() {} は、 try の {} 中で例外が発生したら catch の {} に飛び、その後は後続のコードに進むだけです。 また、 try の {} の中にまた try{}catch{} を含めることも可能です。 例外が発生した場合・しなかった場合のどちらでも、変数のスコープ(try や catch の {} もスコープの区切りです)やファイルのオープン/クローズの対応が合っているように記述しなければなりません。
guest

回答2

0

ベストアンサー

正しい入力データと正しくない入力データの実例を見せてください。
そして、正しくない場合、どう処理したいかも示してください。

次のコードは参考になりますか?

Java

1import java.io.*; 2 3class App { 4 void setScore(int k, int v) { 5 System.out.println(k + ", " + v); 6 } 7 8 void setReportScore(int k, int v) { 9 setScore(k, v); 10 } 11 12 void error(int i, int k, String s) { 13 System.out.println("error at " + i + "-" + k + ": " + "[" + s + "]"); 14 } 15 16 void readScores(String fname) { 17 try { 18 BufferedReader br = new BufferedReader(new FileReader(fname)); 19 String s, p[], r[]; 20 int i = 0, k; 21 22 while ((s = br.readLine()) != null) { 23 if (i == 0) { 24 String[] subject = s.split("\s+"); 25 } else if (i == 1) { 26 p = s.split("\s+"); 27 for (k = 0; k < p.length; k++) { 28 try { 29 int value = Integer.parseInt(p[k]); 30 setScore(k,value); 31 } catch (Exception e) { 32 error(i, k, p[k]); 33 } 34 } 35 } else if (i == 2) { 36 r = s.split("\s+"); 37 for (k = 0; k < r.length; k++) { 38 try { 39 int value = Integer.parseInt(r[k]); 40 setReportScore(k,value); 41 } catch (Exception e) { 42 error(i, k, r[k]); 43 } 44 } 45 } 46 i++; 47 } 48 br.close(); 49 } catch (Exception e) { 50 System.out.println(e.getMessage()+"\n"); 51 } 52 } 53} 54 55class Main { 56 public static void main(String[] args) { 57 App app = new App(); 58 System.out.println("-- file1.txt --"); 59 app.readScores("file1.txt"); 60 System.out.println("-- file2.txt --"); 61 app.readScores("file2.txt"); 62 } 63}

file1.txt

text

1abcde fgi 2123 45 6789 3314 1592

file2.txt

text

1abcde fgi 2123 4.5 6789 3xyz 1592

実行結果

text

1-- file1.txt -- 20, 123 31, 45 42, 6789 50, 314 61, 1592 7-- file2.txt -- 80, 123 9error at 1-1: [4.5] 102, 6789 11error at 2-0: [xyz] 121, 1592

投稿2021/10/22 15:14

kazuma-s

総合スコア8224

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

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

hanao_

2021/10/25 07:58

すみません、、質問の仕方が悪かったですね、、、 とても参考になりました!本当に助かりました!
guest

0

例外が出たら、その直後のcatchまで飛びます。
そこで何か処理をしてもとに戻ればいいんだけど、飛んでしまうがために、処理が中途半端に尻切れになってしまって、続きの処理を行おうと思っても、そのためにエラーとなってしまいます。

まずは、どういうエラーが出たのか、なぜそのエラーが出るのか、を理解しましょう
そして、そのエラーを出なくするためにはどうすればいいのかを考えましょう

投稿2021/10/22 12:37

y_waiwai

総合スコア87800

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

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

hanao_

2021/10/25 07:59

もう一度考え直してみて、なぜダメだったのかわかりました! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問