• ベストアンサー

例外処理がまったくわかりません!!

下のプログラミングについていくつか質問があります。 (1)etest()メソッドってなんですか? (2)存在しないファイルを開くってどういうことですか? (3)FileReader( )対応catch節、Close( )対応catch節ってなんですか? (4)あと、プログラミングあとの本の解説の部分がよくわかりません。抜粋してみます。 「一般的な例外クラスはxxxExceptionというクラス名をしています。このタイプの例外クラスはみな「Exception例外クラス」をスーパークラスにしています。この場合、「catch(Exception e)」を使うとすべてのxxxException例外を補足できるという仕様になっています。ですから下のetest( )メソッドは次のように、ひとつのcatch節で記述することができます。このようにしても表示される4エラーメッセージ(eで指示)は、正しく発生例外(FileNotFoundExceptionまたはIOException) 対応のものになります。」 public static void etest( ) { try { // try節を書く FileReader fr = new FileReader("xfile.txt"); } catch (FileNotFoundException e) { // FileReader( )対応catch節 System.out.println("例外1: " + e); // 例外情報を表示 return; // 戻る } catch (IOException e) { // Close( )対応catch節 System.out.println("例外2: " + e); // 例外情報を表示 return; // 戻る } System.out.println("ファイルは正しくオープンされました"); } } よろしくお願いします。

  • Java
  • 回答数3
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • ranx
  • ベストアンサー率24% (357/1463)
回答No.3

No.2です。再質問を頂いたようなので。 > Javaに組み込まれてないメソッドを作るときにはうしろの方で > そのメソッドの返り値と引数を定義しないといけないんじゃ > ないでしょうか? 「うしろの方」という言い方は、何だか笑っちゃいますね。 別に前でも後ろでも構いません。対象となるクラスのどこかで 定義されていればOKです。 で、ご質問のプログラムの場合ですが、実はその定義だけが 書かれていて、それを使う部分が書かれていないんです。 (質問者さんの表現を借りれば、「うしろの方」が書かれていて 「まえの方」が書かれていない。) 例えば、次のような記述があれば、めでたく完結するわけです。 public static void main(String[] args) {  etest(); }

who_is_next_
質問者

お礼

お返事ありがとうございます。なるほど、そういうことでしたか「うしろの方」が書かれてなかったんですね。それでetstってどこから来たのかわかります?作者が勝手につけた名前だそうですが。(etestじゃなくてetstでした。。。) それとすいませんたいがいプログラムの冒頭の方にあるpublic static void main(String[] args)のところは今まで気にしてなかったんですがこれもメソッドということですか?すいませんすると下のプログラムではpublic static void main(String[] args)とメソッドを定義したのにそれを使うメソッド(ボクの表現で言えば前のほうに書いてあるやつ(笑))が書かれてないということですか?そんなことあっていいんですか?System.out.println(c)は標準メソッドだから関係ないですよねぇ・・・。なんども質問してすみません!! public class JcVar1 { // JcVar1.java [java] public static void main(String args[]) { int a, b, c; // 変数の宣言 a = 10; // 値の代入 b = 20; // 値の代入 c = a + b; // 2数の加算 System.out.println(c); // 結果の出力 } } 

その他の回答 (2)

  • ranx
  • ベストアンサー率24% (357/1463)
回答No.2

(1) Javaではプログラムの単位を「メソッド」と言います。古いプログラミング言語で   「サブルーチン」と呼ばれるものと似ていますが、オブジェクト指向という考え方から   「メソッド」と呼びます。詳しくは、オブジェクト指向についてきちんと勉強して   下さい。etest()は作成者が勝手につけた名前です。要するに、質問で取り上げられた   プログラムのことです。 (2) 存在しないファイルは開くことができません。一般的に、何かをやろうとした時に、   実はそれはできないことでした、という場合、例外が発生します。存在しない   ファイルを開こうとした場合はFileNotFoundExceptionが発生します。 (3) FileReader()というコンストラクタは、ファイルが存在しなかった場合に例外を   発生します。それがFileNotFoundExceptionです。close()というメソッドは、   (質問のプログラムには書かれていませんが)入出力に関したトラブルが起きた   場合にIOExceptionという例外を発生します。つまり、ここでcatchされている   例外には、次のような対応があることになります。     FileNotFoundException - FileReader() で起きた例外     IOException - close() で起きた例外(一般的にはclose()に限りませんが) (4) 上記FileNotFoundExceptionとIOExceptionは、どちらもxxxExceptionという形式の   名前になっています。どちらもExceptionクラスのサブクラスです。ですから、     catch (FileNotFoundException e){ ・・・ }     catch (IOException e){ ・・・ }   などと分けて書かなくとも、     catch (Exception e){ ・・・ }   と書けば、すべての例外を処理できます。

who_is_next_
質問者

お礼

お返事どうもありがとうございました!! すべての質問に答えていただいてありがとうございます。 >etest()は作成者が勝手につけた名前です。要するに、質>問で取り上げられたプログラムのことです。 すいませんここがやはりまだちょっとわからないのですがどういうことでしょうか?Javaに組み込まれてないメソッドを作るときにはうしろの方でそのメソッドの返り値と引数を定義しないといけないんじゃないでしょうか?メソッドの作り方のところでそう習いましたけど・・・。

  • torokonbu
  • ベストアンサー率40% (25/62)
回答No.1

すべて3行目の >FileReader fr = new FileReader("xfile.txt"); という命令に対して、何かしらの問題が発生した場合に対処する処理だと考えてください。 3行目の処理をやって(try)、エラーが発生した場合、その(エラー)に該当する所が受け取り(catch)対処するというイメージです >FileReader fr = new FileReader("xfile.txt"); ここで【xfile.txt】というファイルを指定していますが、 この命令に対し、そんな名前のファイルが見つからない(つまりエラーですね)場合に処理するのが >catch (FileNotFoundException e)の中の処理です。 【FileNotFound】という名前からピンと来ると思います。 >catch (IOException e)は入出力に関するエラー処理です。【IO = Input/Output】 etest()メソッドは作成者が付けたメソッド名前でしょう。深い意味は無いです。

who_is_next_
質問者

お礼

お返事どうもありがとうございます!!! とてもわかりやすくて大変参考になりました。 >etest()メソッドは作成者が付けたメソッド名前でしょう。深い意味は無いです。 すいません、ここがよくわかりないのですがどういうことでしょうか? もう少し解説お願いできないでしょうか? 作成者が勝手に付けたメソッドって確か返り値と引数の定義などが必要じゃないのですか? int(a, b) a=b^2 というように。

関連するQ&A

  • 例外処理についてお願いします!!

    下のプログラミングについていくつか質問があります。 (1) プログラムの冒頭に来るpublic static void main(String[] args)を今まで気にしていなかったのですが これはどういうことですか?これもメソッドのひとつなんですか?このプログラムではpublic static void main(String[] args)でメソッドを定義してそれをetest( )メソッドで開いているという感じでしょうか? それとetstってどこから来たのかわかります?作者が勝手につけた名前だそうですが。 (2)FileReader fr = new FileReader("xfile.txt"); のところがわかりません。これはどういう意味ですか? public static void main(String[] args) { public static void etst( ) { try { // try節を書く FileReader fr = new FileReader("xfile.txt"); } catch (FileNotFoundException e) { // FileReader( )対応catch節 System.out.println("例外1: " + e); // 例外情報を表示 return; // 戻る } catch (IOException e) { // Close( )対応catch節 System.out.println("例外2: " + e); // 例外情報を表示 return; // 戻る } System.out.println("ファイルは正しくオープンされました"); } } } よろしくお願いします!!

    • ベストアンサー
    • Java
  • 例外、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を返す」 という二つの方法を使っているのにはどういう理由があるのか教えて下さい。

  • close()で例外が投げられる理由

    最近、Java を勉強しはじめておるのですが、ファイル入出力処理で例えば、out.txt なるファイルを出力するサンプルとして FileWriter out = null; try {  wt = new FileWriter("out.txt");  out.write("はろー"); } catch ( IOException e ) {  e.printStackTrace(); } finally {  try {   if (out != null ) out.close();  } catch (IOException e) {   e.printStackTrace();  } } という風に、FileWriter オブジェクト out をクローズする時に IOException 例外が投げられる可能性に対処するため、try / catch でこれをつかまえるように、と聞きました。 そして驚くべきことに、close() が例外を投げた時の catch 節には特に書くべき処理はない、というのです。 そこで質問です。 1. 本当に FileWriter#close() の IOException 例外に対処するためのコードは不要なのですか?(常に握り潰しているだけ?) 2. 対処するコードが不要なら、そもそも FileWriter#close() が IOException 例外を投げる必要がないのではないですか? 長文失礼しました。

  • どの例外でcatchすればいいのですか?

    例外の使い方を理解できていません。 さっき検索してみて下の質問と回答を見つけました。 例外処理がまったくわかりません!! http://www.okweb.ne.jp/kotaeru.php3?q=704380 この中の#2さんの回答、 >    catch (FileNotFoundException e){ ・・・ } >     catch (IOException e){ ・・・ } >   などと分けて書かなくとも、 >     catch (Exception e){ ・・・ } >   と書けば、すべての例外を処理できます。 を読むと「それなら、どんな例外でもすべて"(Exception e)"でcatchすればいいじゃん」と思うのですが駄目ですか? もし駄目ならどんな基準でExceptionを選んでいるのですか? 例えば、下のような二分検索木への挿入メソッドの場合、 どこでどのような例外を使ってcatchすればいいのですか? 私の思うような例外を入れてみましたが、どんなエラーが出るかも分からないし…。 だからと言ってthrow ~ catchを入れないとJBuilderが怒るんですよね…。 public void insert(int el) { IntBSTNode p = root, prev = null; try { while (p != null) { prev = p; if (p.key < el) p = p.right; else p = p.left; } if (root == null) root = new IntBSTNode(el); else if (prev.key < el) prev.right = new IntBSTNode(el); else prev.left = new IntBSTNode(el); } catch (Exception x) { System.out.println("エラーだ! 何か表示"); } } 分かる方、説明をお願いします。

    • ベストアンサー
    • Java
  • 例外処理の付け方

    javaを使って通信のプログラムを作成しています。 ホストAで送信データを作成し、そのデータをホストBに送信して、 ホストAが送信するのにかかった時間と、ホストBが受信するのにかかった時間を 計測するプログラムを作成しました。 送信と受信の処理を行うのですが、送信側では、write()でバッファに書き込んで、 fulsh()で書き込まれたバイトを出力ストリームに書き込みます。 受信側では、while((ch=in.read()) != -1)で送信データをすべて読み込ませます。 write()、fulsh()を使って送信し、read()で受信するのですが、 これらのメソッドが正常に動いたかどうかを調べたいのです。 ネットで方法を調べたのですが、try catchを使うことで例外処理が発生したら、 エラーを出力させることができることがわかりました。 もしurite(),fulsh(),read()が正常に起動しないならエラーを出したいのです。私なりに考えて以下のようにしました。 コードは以下のとおりです。送信部分、受信部分です。 送信側 int count = 0; // write()の回数 System.out.println("<データ送信処理>"); start = System.nanoTime(); // 計測開始時間 for (int i = 0; i < Data - 2; i++) {   try {     out.write(i);     count++;   } catch (IOException e) {     System.out.println(i + ":書き込みエラー");   } } try{   out.write('\\'); }catch(IOException e){   System.out.println("\\" + "書き込みエラー"); } try{   out.write('s'); }catch(IOException e){   System.out.println("s" + "書き込みエラー"); } count = count + 2; out.flush(); stop = System.nanoTime(); // 計測終了時間 System.out.println("送信完了"); 受信側 while (ch != -1) {   try{     ch = in.read();   }catch(IOException e){     System.out.println("読み込みエラー");   }   Count++;   if (ch == '\\') {     on = true;   } else if (on == true && (char) ch == 's') {     stopNs = System.nanoTime();     System.out.println("受信終了時間を確認");     break;   } else if (on == true && (char) ch != 's') {     on = false;   } } メソッドが正常に起動しない場合は、例外処理を行うということを したいのですが、上の方法は正しいのでしょうか? このようにして実行しても、「入力エラー」と言う表示はされません。 もしかしたら、ただ異常な動作が行われていないから、そういったエラーが 表示されないのかもと考えましたが、例外処理の書き方が違う可能性があると思い、 質問させていただきました。 どなたかアドバイスしていただけないでしょうか?

    • ベストアンサー
    • Java
  • 呼び出し側ってなんですか?

    下に抜粋した本の解説の部分がわかりません。「呼び出し側」ってなんですか? -------------------------------------------------- このプログラムのetst( )メソッドでは、スロー宣言「throws FileNotFoundException」が行われます。 記述(1)でエラーが発生したら、その情報を呼び出し側に送り、そこでetst( )の処理は終わりになるため、記述(2)は実行されません。記述(1)でエラーが発生しなかった場合は、記述(2)が実行されます。 import java.io.*; public class JcReig3 { // JcReig3.java [java] public static void main(String args[]) { try { etst(); } catch (FileNotFoundException e) { // 呼び出し側でcatch節を書く System.out.println("例外発生: " + e); } } // こちらはthrows宣言を書く public static void etst() throws FileNotFoundException { FileReader fr = new FileReader("xfile.txt"); // (1) System.out.println("正しくオープンされました"); // (2) } }

    • ベストアンサー
    • Java
  • 例外処理について

    こんにちは。 とあるメソッドで例えば 「void openErrorFile(){」とあるのですが、 メソッド内部で } catch (Exception e) { throw new RuntimeException();} と例外をThrowしています。 この場合、メソッドの定義「openErrorFile()」にはThrows句を 付ける必要は無いのでしょうか?。 すみませんがご教授願います。

    • ベストアンサー
    • Java
  • 他ファイルで定義された自作例外の受け方

    他ファイルで定義された自作例外の投げ方と受け方を 教えて下さい。 // ------ Class.java ---> import java.io.*; public class Class1 {  static Class2 oClass2;  public static void main (String[] args)  {   try {    oClass2 = new Class2();    System.out.println("main");    oClass2.vfFunc();   } catch (MyException e) {    System.out.println("catch MyException");   } catch (Exception e) {    System.out.println("catch Exception");   }  } } // <------ Class1.java --- // ------ Class2.java ---> import java.io.*; public class Class2 {  public Class2()  {   System.out.println("Class2コンストラクタ");  }  public void vfFunc()  {   System.out.println("Class2 vfFunc");   throw new MyException();  }  public class MyException extends Exception  {   public MyException()   {    System.out.println("MyException");   }  } } //<------ Class2.java ---

    • ベストアンサー
    • Java
  • 携帯用Java CLDC1.1でファイルのロードとセーブ

    <環境> IDE:NetBeans 6.1 CLDC 1.1 MIDP 2.0 携帯上でのファイルのロード、セーブの仕方が分かりません。 FileReaderやBufferedReaderがないのでやりかたが分かりません。一応Connectorを使って、こんな感じになりました。 ファイルのロード try { InputStreamReader in = new InputStreamReader   (Connector.openInputStream("C:\\data.txt")); (略) // ここにあるin を使ったメソッドは省略 in.close(); } catch (Exception e) { System.out.println(e); } ファイルのセーブ try { OutputStreamWriter out = new OutputStreamWriter (Connector.openOutputStream("C:\\data.txt")); (略) // ここにあるout を使ったメソッドは省略 out.close(); } catch (Exception e) { System.out.println(e); } どちらもClassNotFoundExceptionとConnectionNotFoundExceptionを返してしまいます。何故なんでしょう?ファイルパスが間違っているようなのですが、Cドライブにたしかにdata.txtは存在しています。 非常に困っています。

  • 例外処理に関して

    質問なのですが、よろしくお願い致します。 ファイルに空白行があった場合、任意に例外を発生させることをしているのですが、 (例外処理内容:ファイルにログを出力する) 例外が2回キャッチされているようで、2回目にファイル(ログファイル)は既に開かれています。というエラーが出ますが、以下のソースでは、呼出元と呼び出されたメソッドともに例外を処理してしまうのでしょうか? また、どう改善したらいいでしょうか? ご教授よろしくお願い致します。 呼出元 public Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick Try    Dim cls As New testClass cls.timer1() Catch e as Exception 'ログファイル出力 End Try End Sub 呼び出されるメソッド Public Sub Timer1() try FileOpen(1,"ファイルパス",OpenMode.Input) if Trim(LineInput(1)) = "" Then FileClose(1) Throw New Exception End If Catch e as Exception    'ログファイル出力 End Try End Sub