• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:"try{}catch(){}"文で"close()"はどのように書けばよいのでしょうか。)

"try{}catch(){}"文で"close()"はどのように書けばよいのでしょうか。

このQ&Aのポイント
  • プログラム1で定義されているclose()の書き方について質問します。プログラム2のようなclose()の書き方が良いのかどうか確認したいです。プログラム1ではout.writeObject(memento)行の例外が発生すると、close()が実行されないため、プログラム2のようなfinallyブロックを使った書き方が良いのではないかと考えています。
  • プログラム1とプログラム2でのclose()の書き方について教えてください。プログラム1ではout.writeObject(memento)行の例外によって、close()が実行されない可能性があります。一方、プログラム2ではfinallyブロックを使ってclose()を実行するようにしています。どちらの書き方が良いのか、ご意見をお聞かせください。
  • プログラム1とプログラム2でのclose()の書き方について質問です。プログラム1では、out.writeObject(memento)行の例外によってclose()が実行されない可能性があります。一方、プログラム2ではfinallyブロックを使ってclose()を実行するようにしています。どちらの書き方が適切なのか、アドバイスをお願いします。

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

  • ベストアンサー
  • Bonjin
  • ベストアンサー率43% (418/971)
回答No.1

>私のこの考え方は正しいのでしょうか。 正しいです。質問者さんが書かれているやり方が一般的です。 念のため書いておきますが、outをtryの外で宣言しないとコンパイルが通りません。 まぁ、あくまでデザインパターンを学ぶための本ですから、細かなコーディングについて気にする必要はないでしょう(疑問を持つことは良いことですが)。

noname#91531
質問者

お礼

片岡です。 Bonjinさん、回答ありがとうございます。 close()の書き方について自信がなかったので、安心しました。 また、out変数の宣言については、私はわかっていませんでした。 ご指摘助かります。 変更後のプログラム ●プログラム3 public class Main { public static void saveMemento(Memento memento) { ObjectOutput out = null; try { out = new ObjectOutputStream(new FileOutputStream("game.dat")); out.writeObject(memento); } catch (IOException e) { e.printStackTrace(); } finally { if (out != null) { try { out.close(); } catch (IOException ex) { ex.printStackTrace(); } } } } … //以下略 } public class Memento implements Serializable { … //以下略 } Bonjinさん、ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 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 例外を投げる必要がないのではないですか? 長文失礼しました。

  • Javaのシリアライズについて質問です。

    Javaのシリアライズについて質問です。 以下の二つのコードで実行すると、ちゃんとシリアライズされたデータが生成されるのですが このコードでは実行するたびにデータが上書きされてしまいます。 これを実行するたびに新しいデータを最後尾に追加するような形にしたいのですがどのようにすればいいのでしょうか? よろしくお願いします。 ------------------------------------------------------------------------------- import java.io.FileOutputStream; import java.io.ObjectOutputStream; import java.io.FileInputStream; import java.io.ObjectInputStream; public class Main { public static void main(String[] args) { Data data = new Data(); data.setName("testtesttest"); try { FileOutputStream outFile = new FileOutputStream("data.txt"); ObjectOutputStream out = new ObjectOutputStream(outFile); out.writeObject(data); out.close(); outFile.close(); } catch(Exception ex) { ex.printStackTrace(); } } } ----------------------------------------------------------------------------------- import java.io.Serializable; public class Data implements Serializable { private String name = ""; public void setName( String NameData ) { name = NameData; } } -----------------------------------------------------------------------------------

    • ベストアンサー
    • Java
  • Try-catch文(FileInputStream)

    下記コードでエラーが出現して困っています。 fis.close();の部分でコンパイルエラー( 変数 fis は初期化されていない可能性があります。)の結果が返ってきます。 必ず通過するfinallyブロックにclose()処理を記述して、この処理もエラーが発生する可能性があるので、try-catchする必要があると教師が言っていました。 エラーが出現する原因はなぜでしょうか? 回答のほどよろしくお願い致します。 FileInputStream fis; try{ fis = new FileInputStream(fi.getAbsolutePath()); while( (b[i++] = fis.read()) != -1); }catch(FileNotFoundException e){ } catch(IOException e){ }finally{ try{ fis.close(); ←コンパイルエラー( 変数 fis は初期化されていない可能性があります。) }catch(IOException e){ } }

    • ベストアンサー
    • Java
  • Try~Catch、Finallyについて。

    下記のように、DataSetをXML出力するメソッドを作りました。 Public Sub WriteXml(ByVal xmlDs As DataSet) Try Dim fileStream As New System.IO.FileStream(holdFilePath, System.IO.FileMode.Create) Dim setting As New System.Xml.XmlWriterSettings '文字コード設定 With setting .Encoding = System.Text.Encoding.UTF8 .Indent = True End With Dim writer As System.Xml.XmlWriter = Xml.XmlWriter.Create(fileStream, setting) 'XMLへの書き込みを行い、FileStreamを閉じる xmlDs.WriteXml(writer) writer.Close() fileStream.Close() Catch ex As Exception MsgBox(ex.message) End Try End Sub メソッドは以上です。 writer.Close()、fileStream.Close()については、確実に 処理を行いたいので、Finallyで行おうかと思ったのですが、 その場合、Dim fileStream~、Dim writer~はTryの外に出さないと、 宣言されていないと言われてしまいます。 そうなると今度は、NewやXml.XmlWriter.Create(fileStream, setting) でコケた場合にCatchが出来ません…。 Usingを使うのが近いかなと思ったんですが、複数Newしている場合 でも使えるのでしょうか? 確実にClose処理を行うための改修箇所、アドバイスいただけ ないでしょうか? よろしくお願いします。

  • TCP/IP通信について

    現在、以下のようにTCP/IP通信のプログラミングを行っており、 サーバ/クライアント別々に4byteのデータ送信を10msec毎に10秒間行っております。 現在、WimdowsVista-Windows7間で各々をサーバ/クライアントとして順に起動し、 相互に4byte送信しているハズが、倍の8byteや12byteとデータが連なって送信されている 事象が発生してます。 OutputStreamではwrite後にflushを行っているので、flush契機でメモリ上に蓄えられた 送信用バッファが送信されるイメージでおりますが、4byteで送信できていないように見えます。 上記について、解決方法をご存じであればご教授お願い致します。   <Server.java> ===== public class Server {  public static ServerSocket ss = null;  public static Socket soc = null;  private static InputStream is = null;  private static OutputStream os = null;  public static void main(String[] args) {      try {    // サーバソケット生成    ss = new ServerSocket(5000);    soc = ss.accept();    is = soc.getInputStream();    os = soc.getOutputStream();    Thread rcvTh = new ServerRcvThread(is);    rcvTh.start();    Thread sndTh = new ServerSndThread(os);    sndTh.start();    // 10秒スリープ    try{     Thread.sleep(10000);    } catch ( Exception e){     e.printStackTrace();    }    // スレッド停止    rcvTh.stop();    sndTh.stop();   } catch (IOException e) {    e.printStackTrace();   } finally{    try {     is.close();     os.close();     soc.close();     ss.close();    } catch (IOException e) {     e.printStackTrace();    }      }  } } class ServerSndThread extends Thread{  private static OutputStream ous = null;  ServerSndThread( OutputStream os ){   this.ous = os;  }  public void run(){   byte sndData[] = new byte[4];   sndData[0] = 0x01;   sndData[1] = 0x02;   sndData[2] = 0x03;   sndData[3] = 0x04;   try {    while(true){     // データ書込み     ous.write(sndData);     ous.flush();     System.out.println("データ送信");     // 0.01秒スリープ     try{      Thread.sleep(10);     } catch ( Exception e){      e.printStackTrace();     }    }   } catch (IOException e) {    e.printStackTrace();   }  } } class ServerRcvThread extends Thread{  private static InputStream ins = null;  ServerRcvThread( InputStream os ){   this.ins = os;  }    public void run(){   byte rcvData[] = new byte[16];   int size = 0;   try {    while(true){     // データ読込み     size = ins.read(rcvData);     System.out.println("size:"+size+"byte");    }   } catch (IOException e) {    e.printStackTrace();   }  } } =====     <Client.java> ===== public class Client {  private static Socket soc = null;  private static OutputStream os = null;  private static InputStream is = null;  public static void main(String[] args) {   try {    // ソケット生成    soc = new Socket("192.168.3.3", 5000);    is = soc.getInputStream();    os = soc.getOutputStream();    Thread rcvTh = new ClientRcvThread(is);    rcvTh.start();    Thread sndTh = new ClientSndThread(os);    sndTh.start();    // 10秒スリープ    try{     Thread.sleep(10000);    } catch ( Exception e){     e.printStackTrace();    }    // スレッド停止    rcvTh.stop();    sndTh.stop();   } catch (IOException e) {    e.printStackTrace();   } finally{    try {     is.close();     os.close();     soc.close();    } catch (IOException e) {     e.printStackTrace();    }      }     } } class ClientSndThread extends Thread{  private static OutputStream ous = null;  ClientSndThread( OutputStream os ){   this.ous = os;  }    public void run(){   byte sndData[] = new byte[4];   sndData[0] = 0x04;   sndData[1] = 0x03;   sndData[2] = 0x02;   sndData[3] = 0x01;   try {    while(true){     // データ書込み     ous.write(sndData);     ous.flush();     System.out.println("データ送信");     // 0.01秒スリープ     try{      Thread.sleep(10);     } catch ( Exception e){      e.printStackTrace();     }    }   } catch (IOException e) {    e.printStackTrace();   }  } } class ClientRcvThread extends Thread{  private static InputStream ins = null;  ClientRcvThread( InputStream os ){   this.ins = os;  }    public void run(){   byte rcvData[] = new byte[16];   int size = 0;   try {    while(true){     // データ読込み     size = ins.read(rcvData);     System.out.println("size:"+size+"byte");    }   } catch (IOException e) {    e.printStackTrace();   }  } } =====

    • ベストアンサー
    • Java
  • 「IOException は対応する try 文の本体ではスローされません。」というエラー。

    次のようなクラスを作成したのですが、表題のようなエラーが出てしまいます。 PrintWriterクラスのcloseメソッドは、 Closableインターフェースのcloseと witerクラスのcloseと同じ定義だと考えていたので、きっとIOExceptionが発生すると考えていたのですが・・・違うのでしょうか? Finallyの中にtryを書くと何か問題が起こるのでしょうか? ソースをそのまま書くのは気が引けるのですが、どうか教えて頂けないでしょうか? /** * ファイルに文字を書き込むクラス */ class Sample { PrintWriter writer; //書き込むためのクラス public void writerTest() { try { //** テストファイルに書き込み */ writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream("sample.txt",false),"EUC-JP"))); //書き込みを行います writer.println("A"); writer.flush(); } catch(IOException ioe) { System.out.println(ioe.getMessage()); } finally { try { writer.close(); } catch(IOException ioe) //このcatchでエラーが発生します。 { System.out.println(ioe.getMessage()); } } } }

    • ベストアンサー
    • Java
  • try~catch構文は、どういうメリットがあるのですか?

    以下は 関数 hoge に失敗したら、例外を補足するコードです。 try {   if (!hoge()) {     throw new Exception('hogeに失敗しました');   } } catch (Exception $e) {   echo $e; } 以下のように書いたほうが分かりやすいと思いますが、 駄目なんでしょうか? hoge() || die('hogeに失敗しました'); ちなみに、DBのトランザクションを利用して、何かに失敗したら、 catch 以下でロールバックするのは便利だと思います。 しかし、こういう場合以外で、try~catch構文を使うメリットは何でしょう?

    • ベストアンサー
    • PHP
  • javaについて

    このプログラムは文字を入力して、検索をかけてその検索にかかった秒数を表示するものですが、検索数を表示するのにはどう書き換えますでしょうか? import java.io.*; import java.net.*; public class Sample { public static void main(String[] args) { System.out.println("入力してください"); String keyword = getKeyword(); String htmlSrc = getHTMLSrc("http://search.yahoo.co.jp/search?p=" + keyword, "UTF-8"); double sec = getSearchSec(htmlSrc); if (sec > 0) { System.out.println("検索秒数は" + sec + "秒"); } else { System.out.println("検索結果0件"); } } private static String getKeyword() { String keyword = ""; BufferedReader br = null; try { br = new BufferedReader(new InputStreamReader(System.in)); keyword = br.readLine(); } catch (IOException e) { e.printStackTrace(); } finally { try { br.close(); } catch (IOException e) { e.printStackTrace(); } } keyword = keyword.replaceAll(" ", "+"); return keyword; } private static String getHTMLSrc(String strURL, String charSet) { StringBuffer sb = new StringBuffer(); HttpURLConnection conn = null; BufferedReader br = null; try { URL url = new URL(strURL); conn = (HttpURLConnection)url.openConnection(); InputStreamReader isr = new InputStreamReader(conn.getInputStream(), charSet); br = new BufferedReader(isr); String tmp = ""; while ((tmp = br.readLine()) != null) { sb.append(tmp); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (br != null) { br.close(); } if (conn != null) { conn.disconnect(); } } catch (IOException e) { e.printStackTrace(); } } return sb.toString(); } private static double getSearchSec(String htmlSrc) { double sec = 0; String tmp = htmlSrc.replaceAll("<.+?>| ", ""); tmp = tmp.replaceAll(".*件-", ""); tmp = tmp.replaceAll("秒.*", ""); try { sec = Double.parseDouble(tmp); } catch (NumberFormatException e) { } return sec; } }

    • ベストアンサー
    • Java
  • 「例外 *** は対応する 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
  • この問題の解説をお願いします。

    次のコードの実行結果は? ------------------------------------------------------------------------------ 01 : import java.io.*; 02 : 03 : public class CodeWalkSeven { 04 :   public static void main(String[] args) { 05 :     Car c = new Car("Nissan", 1500, "blue"); 06 : 07 :     System.out.println("before:" + c.make + " " + c.weight); 08 : 09 :     try { 10 :       FileOutputStream fs = new FileOutputStream("Car.ser"); 11 :       ObjectOutputStream os = new ObjectOutputStream(fs); 12 :       os.writeObject(c); 13 :       os.close(); 14 :     } catch (Exception e) { 15 :       e.printStackTrace(); 16 :     } 17 : 18 :     try { 19 :       FileInputStream fis = new FileInputStream("Car.ser"); 20 :       ObjectInputStream ois = new ObjectInputStream(fis); 21 :       c = (Car) ois.readObject(); 22 :       ois.close(); 23 :     } catch (Exception e) { 24 :       e.printStackTrace(); 25 :     } 26 : 27 :     System.out.println("after:" + c.make + " " + c.weight); 28 : 29 :   } 30 : } 31 : 32 : class NonLiving { 33 : 34 : } 35 : 36 : class Vehicle extends NonLiving { 37 :     String make = "Lexus"; 38 :     String color = "Brown"; 39 : } 40 : 41 : class Car extends Vehicle implements Serializable { 42 : 43 :   protected int weight = 1000; 44 : 45 :   Car(String n, int w, String c) { 46 :     color = c; 47 :     make = n; 48 :     weight = w; 49 :   } 50 : } ------------------------------------------------------------------------------ 実行結果 before:Nissan 1500 after:Lexus 1500 上記問題の解説でよくわからないとこがありますので、質問しました。 解説では、「書き込む前にCarオブジェクトに"Nissan"をセットしているが、Vehicleのコンストラクタにより初期化され、変数makeには初期値の"Lexus"がセットされる。」となっています。 私はコンストラクタはインスタンス化した際に実行される認識ですが、 この解説の記述ですと、21行目のCarクラスへのキャスト処理時にVehicleのコンストラクタが実行されているように受け取りました。 コンストラクタはキャスト時にも実行されるものなのでしょうか? もしそうであるならば、Javaの仕様書等に記載がある場合は、そのソースも教えていただけないでしょうか? 解説を読んでも納得いかずもやもやしています。 どなたかご回答お願いします。

    • ベストアンサー
    • Java