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

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

ただいまの
回答率

89.13%

java Exceptionのエラーについて

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 4,768

前提・実現したいこと

このページの問題が解きたいです。
https://uva.onlinejudge.org/index.php?option=onlinejudge&page=show_problem&problem=2315

概要は、何個かの文字(アルファベットもしくは記号)に報酬金が指定されてあり、
新聞記者は、自分の記事の中に報酬の対象となる文字が1回表れる度に、その文字に対応した額が加算され、
そのようにして計算した時の合計額が報酬としてもらえる、という変わった会社が舞台となっています。

1行目の入力が試行回数(記事の数)、2行目の入力が1文字のアルファベットまたは記号と数字の組を何個入力するか、
その後、2行目で入力した行数だけ文字と数字の組を入力
その後、英文(記事)の行数を入力し、最後に英文を入力します。

サンプルの入力とその時の出力は以下の通りです。

1
7 
a 3      // 記事中にaが1回表れる度に3セントもらえる
W 10     // 記事中にWが1回表れる度に10セントもらえる
A 100 
, 10 
k 7 
. 3 
I 13 
7 
ACM International Collegiate Programming Contest (abbreviated
as ACM-ICPC or just ICPC) is an annual multi-tiered competition
among the universities of the world. The ICPC challenges students
to set ever higher standards of excellence for themselves
through competition that rewards team work, problem analysis,
and rapid software development.
From Wikipedia.
3.74$

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

方針はなんとなく立っているのですが、ちょっと書いてコンパイルして実行を繰り返すうちに、
問題自体とはあまり関係ないですが、以下のような壁に突き当たり、全く進まなくなってしまいました。

今までは入力の読み込みにはScannerを使っていたのですが、
今回は行丸ごと読んだ方がよさそうだと思ったので、readLineを使ってみました。
http://www1.bbiq.jp/takeharu/java114.html ←このサイトにわかりやすく使い方が載っていたので真似してみたのですが、
これをそのまま使うと

エラー: 例外FileNotFoundExceptionは報告されません。スローするには、捕捉または宣言する必要があります


と出てきたので、catch(FileNotFoundException e)を付け足してみたところ、

Newspaper.java:49: エラー: 例外FileNotFoundExceptionはすでに捕捉されています
        } catch(FileNotFoundException e) {
          ^
Newspaper.java:8: エラー: 例外FileNotFoundExceptionは報告されません。スローする
には、捕捉または宣言する必要があります
        FileReader file = new FileReader(args[0]);
                          ^
エラー2

という、「既に捕捉されています」と「補足する必要があります」という2つの相反するエラーが出てきてしまいました。
一体何がおかしいのでしょうか?

該当のソースコード

import java.io.*;
import java.util.Scanner;
import java.util.InputMismatchException;

class Newspaper {
    public static void main (String[] args) {
        Scanner scan = new Scanner(System.in);
        FileReader file = new FileReader(args[0]);
        BufferedReader br = new BufferedReader(file);

        String output[] = new String[1000];
        int testcase = scan.nextInt();

        try {
            for(int i=0; i<testcase; i++) {
                   int n = scan.nextInt();
                String letter[] = new String[n];
                int value[] = new int[n];

                for(int j=0; j<n; j++) {
                    letter[j] = scan.next();
                    value[j] = scan.nextInt();
                }

                int line = scan.nextInt();
                for(int j=0; j<line; j++) {
                    String str = br.readLine();
                    System.out.println(str);

                    //まだ途中です

                }

                testcase++;
            }

            br.close();

            for(int i=0; i<testcase; i++) {
                System.out.println(output[i]);
            }

        } catch(InputMismatchException e) {
            System.out.println("Input must be type int.");
            System.exit(1);
        } catch(IOException e) {
            System.out.println("Exception :" + e);
            System.exit(1);
        } 
// エラーを受けてここを追加しました その後、上記にある矛盾のようなエラーメッセージが出てきました   
       catch(FileNotFoundException e) {
         System.out.println("Exception :" + e);             
             System.exit(1);
        }
    }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

ここでcatchすべきは、tryブロックの前にあるFileReaderのコンストラクタからスローされる例外です。このコンストラクタを囲むtryブロックが必要です。
今あるtry-catchに続けた際に「すでに捕捉されています」と出るのは、すでにその前にFileNotFoundExceptionの親クラス型IOExceptionを捕捉しているため、そこに到達することがないためです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/04/22 03:15

    FileNotFoundExceptionはIOExceptionの子クラスだったんですね…
    あと、恥ずかしながら今までtry文はcatchと一緒に使うという風にしか理解していなかったので、
    どこでtryを置くべきかなどはわかっていませんでした。大変勉強になりました、ありがとうございます!

    キャンセル

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

  • ただいまの回答率 89.13%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る