• 締切済み

Java初心者です。例外のキャッチについて

proustの回答

  • proust
  • ベストアンサー率57% (62/108)
回答No.1

Logger#info()メソッドはIOExceptionをthrowしません。 ですので呼び側から直接catchすることは不可能です。 log4jの中でcatchしてErrorHandlerというものに処理を委譲 したあと、呼び元には例外を出さずに戻っているようです。 これは恐らく、ログ出力をする箇所全てにいちいちIOExceptionを 処理するコードを書かせたくないからだと思います。 (ちなみに、RuntimeExceptionとその子孫以外のExceptionを throwするメソッドがある場合、そのメソッドを呼ぶメソッドは そのExceptionをさらに上位へthrowするか、またはcatchしないと コンパイルエラーになります。aaa()のthrows IOExceptionをとっても エラーにならないでしょう。) で対策ですが、ErrorHandlerインタフェースの実装を自作して、 設定ファイルのerrorHandlerエレメントに登録して使えばいいようです。 ただ、私は使ったことがなく、また、よほどカッチリしたシステムでないと あんまりこれを積極的に使っているケースは見たことがありません。 ログが出ないような状況では、エラーハンドリングするにしても 対策のしようがないからなのでしょう。

参考URL:
http://www.jajakarta.org/kvasir/bbs/technical/32?msg=2#msg93
kenman
質問者

お礼

さっそくの回答ありがとうございます。 Log4J#errorメソッドや#fatalメソッドも Javadocを見ますとIOExceptionをthrowしない ようなので#infoメソッドと同様の扱い (例外をキャッチすることは不可能) ということになるんですね。 ErrorHandlerインタフェースについては どういったものなのかよく理解できていないので 調べてみようと思っています。

関連するQ&A

  • java超初心者

    やさしいjavaという本を読んで勉強しています。 コンパイルというものをすると C:\Sample\01>javac Sample1.java Sample1.java:5: シンボルを解釈処理できません。 シンボル: メソッド printIn (java.lang.String) 位置 : java.io.PrintStream の クラス System.out.printIn("ようこそjavaへ"); ^ とでてきました。どこがおかしいのでしょうか?

    • ベストアンサー
    • Java
  • try catch 文について

    jcpadでプログラムを組んでいます。  コンパイル実行すると 「例外 java.io.IOException は報告されません。スローするにはキャッチまたは、スロー宣言をしなければなりません。」 というエラーがでるのですが、BufferedReaderやDataInputStreamでは 例外処理(try~catch)は必ず書かないといけないんですか?

    • ベストアンサー
    • Java
  • System.inをClose()すると例外が発生する。

    こんにちは、tokopokoといいます。 ■次のプログラムを実行すると、エラーになります。 なぜエラーになるのか、ご存知の方はいらっしゃいませんか。 import java.io.*; class TestInput { public static void main(String[] args) { System.out.println("first = \"" + getInputValue("first?") + "\""); System.out.println("second = \"" + getInputValue("second?") + "\""); } public static String getInputValue(String message) { String returnString = ""; System.out.print(message); BufferedReader input = null; try { input = new BufferedReader(new InputStreamReader(System.in)); returnString = input.readLine(); } catch (IOException e) { e.printStackTrace(); } finally { if (input != null) { try { input.close(); } catch (IOException e) { e.printStackTrace(); } } } return returnString; } } ■実行例 D:\>javac TestInput.java D:\>java TestInput first?100 first = "100" second?java.io.IOException: Stream closed at java.io.BufferedInputStream.getBufIfOpen(BufferedInputStream.java:145 ) at java.io.BufferedInputStream.read(BufferedInputStream.java:308) at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264) at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306) at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158) at java.io.InputStreamReader.read(InputStreamReader.java:167) at java.io.BufferedReader.fill(BufferedReader.java:136) at java.io.BufferedReader.readLine(BufferedReader.java:299) at java.io.BufferedReader.readLine(BufferedReader.java:362) at TestInput.getInputValue(TestInput.java:14) at TestInput.main(TestInput.java:5) second = "" ■私の環境は以下の通りです。 OS: Microsoft Windows XP Professional SP2 java: java version "1.6.0_03"

    • ベストアンサー
    • Java
  • qpopper のログについて教えてください

    qpopper のログについて教えてください。 /var/log/messages に 1 時間ごとに下記の様なメッセージが出力されています。 <messages> Jul 7 02:42:19 host qpopper[1088]: Stats: user 0 0 0 0 aaa.aaa.aaa.aaa aaa.aaa.aaa.aaa Jul 7 03:42:30 host qpopper[1613]: Stats: user 0 0 2 4870 aaa.aaa.aaa.aaa aaa.aaa.aaa.aaa Jul 7 04:43:11 host qpopper[1743]: Stats: user 0 0 2 4894 aaa.aaa.aaa.aaa aaa.aaa.aaa.aaa Jul 7 05:42:51 host qpopper[1874]: Stats: user 0 0 2 4894 bbb.bbb.bbb.bbb bbb.bbb.bbb.bbb Jul 7 06:42:36 host qpopper[2000]: Stats: user 0 0 2 4894 bbb.bbb.bbb.bbb bbb.bbb.bbb.bbb Jul 7 07:43:06 host qpopper[2125]: Stats: user 0 0 2 4894 bbb.bbb.bbb.bbb bbb.bbb.bbb.bbb Jul 7 08:43:08 host qpopper[2694]: Stats: user 0 0 2 4894 aaa.aaa.aaa.aaa aaa.aaa.aaa.aaa 1. なぜこの出力がされているのでしょうか。 (user は、私のユーザ名で、ホストは怪しい海外とかではありません) 2. syslog.conf で qpopper.log に出力するようにしているのに、 なぜ messages に出力されてしまっているのでしょうか。 (qpopper.log にも同じ出力がされています) <syslog.conf> *.notice;authpriv.none;kern.debug;lpr.info;mail.crit;news.err /var/log/messages !qpopper *.* /var/log/qpopper.log <inetd.conf> pop3 stream tcp nowait/0/3 root /usr/local/libexec/qpopper qpopper -s <環境> FreeBSD 6.2R qpopper-4.0.9_1 宜しくお願い致します。

  • 例外、null

    Cinクラスでは,BufferedReaderクラスで定義されたreadLineメソッドを使って, 一行ずつ入力を行っている。 class Cin { private static BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); public static String getLine() { String s = ""; try { s = in.readLine(); } catch (IOException e) { System.out.println("IO error!"); System.exit(1); } return s; } } このreadLineメソッドは,入力の終わりに到達するとnullを返し, それ以外の入力エラーがあるとIOException(Exceptionクラスのサブクラス)を投げる。 また入力の終わりに到達したことを,例外を用いて通知することも可能である。 readLineメソッドが,入力に関する状態を示すのに,「例外」、「nullを返す」 という二つの方法を使っているのにはどういう理由があるのか教えて下さい。

  • ハンドルされていない例外が発生?

    C++にて作成したアプリを終了すると0xC0000005エラーが発生します。 エラー箇所は AAA *aaa //AAAは外部クラス(グローバル) void BBB{ aaaa = new aaa; aaa->ccc();} void CCC{ aaa->ddd(); delete aaaa; } メイン関数にてBBB→CCCの順で数回読んでいます。 エラーの原因として何が考えられるでしょうか? 開発環境はWindowsXP VC++6.0です。 よろしくお願いします。

  • 「例外 *** は対応する try 文の本体ではスローされません。」について。

    以下のソースをコンパイルすると, simulator/showManualPage.java:21: 例外 java.net.URISyntaxException は対応する try 文の本体ではスローされません。 } catch (URISyntaxException ex) { ^ simulator/showManualPage.java:23: 例外 java.io.IOException は対応する try 文の本体ではスローされません。 } catch (IOException ex) { ^ とエラーを返されます。 調べたところ、スローされるはずのない例外をキャッチしようとしている、というエラーだとは分かりましたが、スローは書いているので原因が分かりません。 やり方が悪いのでしょうか? package simulator; import java.awt.event.*; import java.awt.Desktop; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; public class showManualPage implements ActionListener { public void showManualPage() throws URISyntaxException, IOException { // Get Desktop Object Desktop desktop = Desktop.getDesktop(); desktop.browse(new URI("http://google.co.jp")); } public void actionPerformed(ActionEvent event) { try { // Run browser new showManualPage(); } catch (URISyntaxException ex) { ex.printStackTrace(); } catch (IOException ex) { ex.printStackTrace(); } } }

    • ベストアンサー
    • Java
  • ファイルに出力する際、上書きしない(Java)

    Javaで、例えばテキストファイルに「aaa」と出力する際、 try { PrintWriter fout = new PrintWriter(new BufferedWriter( new FileWriter("tst1.txt"))); fout.println("aaa"); fout.close(); } としているのですが、このプログラムを一度実行したあと「aaa」の部分を「bbb」と書き直して再度実行した場合、 tst1.txtには、「bbb」と記されています。 つまり、上書きされたということだと思うのですが、 上書きではなくて、「aaa」の後に続けて「bbb」と表記する方法を教えていただきたいです。 うまく説明できていないと思いますが、わかりにくい点は指摘していただければ補足しますので、よろしくお願いします。

    • ベストアンサー
    • Java
  • オブジェクトの関連について

    クラスAAAとクラスBBBをインスタンス化し、それぞれ、aとbのオブジェクトとします。 mainメソッドから、bのbmethメソッドを呼び出し、さらに、Amethメソッドを呼び出し また、mainからもaのAmethメソッドを呼び出し可能にする方法はありませんでしょうか? まだ、Java初心者なもので説明も不十分かと思いますがよろしくお願いします。 class AAA{ void Ameth() { System.out.println("Aメソッド"); } } class BBB{ public AAA a; void bmeth(){ a.Ameth(); } } public class test{ public static void main(String arg[]) { AAA a = new AAA(); BBB b = new BBB(); b.bmeth(); a.Ameth(); } }

  • インスタンス化で落ちてしまいます。

    早速ですがお願いします。 バッチ用classU(名前AAA)からjavabean(名前BBB)を呼び出すために 以下のようにインスタンス化をすると落ちてしまいます。 BBB bbb=new BBB(); ログをいれてみた結果そこで落ちているのは確定です。 またtry catchをいれてみたのですがExceptionをキャッチできてないようでログには何も出ませんでした。 このBBBというのはAAA以外にも普通のサーブレットCCCでもインスタンス化して使えていますので BBBに問題はないように思われます。 AAAを起動させるバッチファイルは全く別のところから java jp.co.xxxx.AAAという形で起動させています。 なぜインスタンス化というところで落ちてしまうのでしょうか? よろしくお願いします。