Java FTPクライアントのプログラムにおけるExceptionの詳細な内容について

このQ&Aのポイント
  • Java FTPクライアントのプログラムで発生するExceptionの詳細な内容について教えてください
  • EclipseでJava FTPクライアントのプログラムを実行した際、catch( Exception ie3 )が到達不可能なブロックと表示されました。このExceptionの詳細について教えてください
  • Java FTPクライアントのプログラムのdoQuitメソッド内で発生するExceptionの詳細な内容について教えてください
回答を見る
  • ベストアンサー

Java FTPクライアントを模したもので・・・

こんにちは。 趣味でプログラミングをしているものです。 さっそくですが質問させていただきます。 小高知宏氏の著作 「基礎からわかる TCP/IP Javaネットワークプログラミング」 の FTPクライアントを模したプログラムについてなのですが、 まずは、以下の抜粋のコードを見ていただきたいのですが、 ------------------------------------------------------------ public class FTP2 { Socket ctrlSocket; PrintWriter ctrlOutput; //ctrlSocket への出力 BufferedReader ctrlInput; //ctrlSocket からのの入力 //ログイン時のパスワード、 //カレントディレクトリ変更時のディレクトリ名を読み取る BufferedReader lineread; final int CTRLPORT = 21; ~ 省略 ~  // FTPサーバーにQUITのコマンドを送信するためのメソッド void doQuit() { try { ctrlOutput.println( "QUIT"); ctrlOutput.flush(); } catch( Exception ie3 ) { ie3.printStackTrace(); System.exit(1); } } ~ 省略 ~ } ----------------------------------------------------------- Eclipseで入力していたのですが、 メソッド doQuit 内の try catch ブロックの catch( Exception ie3 ) が catch( IOException ie3 ) だと Eclipseによって、到達不可能なブロックです と表示されました。 このException の詳しい内容を教えていただけないでしょうか? ご存知の方、よろしくお願いします。

noname#173931
noname#173931
  • Java
  • 回答数3
  • ありがとう数3

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

  • ベストアンサー
  • salsberry
  • ベストアンサー率69% (495/711)
回答No.3

> 通信上の不具合が起こったときにPrintWriter のprintln(), flush() > が正しく動作しない場合というのは起こりうるのでしょうか? 質問文中のctrlOutputとctrlSocketの間がどのように結びつけられているのかが分かりませんが、通信上の不具合が発生したらprintln()やflush()は意図したとおりには動かない可能性が高いでしょう。その場合でもdoQuit()メソッドでIOExceptionをキャッチすることはありませんが。 > Socketを用いて通信が確立されるとサーバー側から通信は > 遮断されないものなのでしょうか? 通信は様々な理由で遮断される可能性があります。 通信が切れたことをdoQuit()で検知したいのだろうと推測しますが、その場合は下記のような方法が考えられます。 ・PrintWriterクラスのcheckError()メソッドを使う ・PrintWriterクラスを使わず、もっと低レベルの処理を自前で行う

noname#173931
質問者

お礼

お礼が遅れてしまい申しわけありません。 また質問させていただくことがありましたら、 よろしくおねがいします。 貴重な時間をさいての回答、ありがとうございました。

その他の回答 (2)

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.2

> この場合において、catch ブロックで捕捉可能なサブクラス PrintWriterのprintln()やflush()にはthrows宣言がなく、文法上これらのメソッドがExceptionを発生する可能性があるとすれば非チェック例外だけです。具体的にはRuntimeExceptionおよびそのサブクラス(NullPointerExceptionやArithmeticExceptionなど)です。 PrintWriterの仕様書には書かれていないのでprintln()やflush()が非チェック例外を発生することはまずないと思いますが。 やる意味があるかどうかを別にすると、自分でPrintWriterのサブクラスを作ってprintln()をオーバーライドすれば、その中で非チェック例外を発生することは可能です。

noname#173931
質問者

お礼

お礼が遅れてしまい申しわけありません。 ですが丁寧に解説していただきありがとうございます。 ついでといっては失礼かもしれませんが 通信上の不具合が起こったときにPrintWriter のprintln(), flush() が正しく動作しない場合というのは起こりうるのでしょうか? FTPサーバー (この場合はクライアントを実行しているパソコンに設定してますが) との通信が途切れる、といった場合Javaの例外は 発生するものなのでしょうか? あるいはSocketを用いて通信が確立されるとサーバー側から通信は 遮断されないものなのでしょうか? 少し長くなりましたがもしよければ 教えていただけないでしょうか? よろしくお願いします。

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.1

PrintWriterのprintln()やflush()はIOExceptionをthrowすることがありません(PrintWriterクラスの仕様を参照のこと)。したがってcatch( IOException ie3 )と書いてもそのcatchブロックが実行されることは絶対にないということです。catch( Exception ie3 )だったら実行される可能性があり得ます。

noname#173931
質問者

お礼

さっそく回答していただきありがとうございます。 もしよろしければもう少し詳しく教えていただけないでしょうか? Exception のサブクラスである, この場合において、catch ブロックで捕捉可能な サブクラスの名前を教えていただけないでしょうか? よろしくお願いします。 とにかく、貴重な時間をさいての回答、ありがとうございました。

関連するQ&A

  • Javaの簡易クライアント

    メールの閲覧ができるプログラムを作成してコンパイルして実行はできるのですが閲覧ができずエラーが出てしまいます。 正しいソースコードを教えてください。プログラムに詳しい方宜しくお願いします。 画像は実行結果です。 import java.io.*; import java.net.*; public class mail2 { public static void main(String args[]) throws IOException { String server,user,pass,str,num; int port = 110; StringBuffer sb = new StringBuffer(""); Socket sock; BufferedReader sockin; BufferedWriter sockout; System.out.println("サーバーを入力"); BufferedReader serverin = new BufferedReader(new InputStreamReader(System.in)); server = serverin.readLine(); System.out.println("ユーザーを入力"); BufferedReader userin = new BufferedReader(new InputStreamReader(System.in)); user = userin.readLine(); System.out.println("パスワードを入力"); BufferedReader passin = new BufferedReader(new InputStreamReader(System.in)); pass = passin.readLine(); try { sock = new Socket(server, port); sockin = new BufferedReader(new InputStreamReader(sock.getInputStream())); sockout = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream())); sockout.write("USER " + user + "\r\n"); sockout.write("PASS " + pass + "\r\n"); sockout.write("LIST\r\n"); sockout.write("QUIT\r\n"); sockout.flush(); while ((str = sockin.readLine()) != null) { System.out.println(str); } sockout.close(); sockin.close(); sock.close(); } catch (Exception ex) { ex.printStackTrace(); } System.out.println("どのメールを見ますか?"); BufferedReader numin = new BufferedReader(new InputStreamReader(System.in)); num = numin.readLine(); try { sock = new Socket (server, port); sockin = new BufferedReader(new InputStreamReader(sock.getInputStream())); sockout = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream())); sockout.write("USER " + user + "\r\n"); sockout.write("PASS " + pass + "\r\n"); sockout.write("RETR " +num+"\r\n"); sockout.write("QUIT\r\n"); sockout.flush(); while ((str = sockin.readLine()) != null) { System.out.println(str); } sockout.close(); sockin.close(); sock.close(); } catch (Exception ex) { ex.printStackTrace(); } } }

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

    Javaの例外はErrorとRuntimeExceptionは書かなくてもいいが、 Exceptionはtryでcatchする必要があると聞きました。 しかし、java.langのStringを使っても例外処理は書きません。 なぜ、例外を書くやつと書かないやつがあるのですか? たとえば、java.langを使うとしたら、 ClassNotFoundException CloneNotSupportedException Exception の3つをjava.langを使うメソッドのブロックの上にtry文が必要だと思うのですが。

    • ベストアンサー
    • Java
  • javaのメールクライアント

    メールの閲覧ができるプログラムを作成していますが閲覧ができずエラーが出てしまいます。 正しいソースコードを教えてください。 import java.io.*; import java.net.*; public class mail2 { public static void main(String args[]) throws IOException { String server,user,pass,str,num; int port = 110; StringBuffer sb = new StringBuffer(""); Socket sock; BufferedReader sockin; BufferedWriter sockout; System.out.println("サーバーを入力"); BufferedReader serverin = new BufferedReader(new InputStreamReader(System.in)); server = serverin.readLine(); System.out.println("ユーザーを入力"); BufferedReader userin = new BufferedReader(new InputStreamReader(System.in)); user = userin.readLine(); System.out.println("パスワードを入力"); BufferedReader passin = new BufferedReader(new InputStreamReader(System.in)); pass = passin.readLine(); try { sock = new Socket(server, port); sockin = new BufferedReader(new InputStreamReader(sock.getInputStream())); sockout = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream())); sockout.write("USER " + user + "\r\n"); sockout.flush(); sockout.write("PASS " + pass + "\r\n"); sockout.flush(); sockout.write("LIST\r\n"); sockout.flush(); sockout.write("QUIT\r\n"); sockout.flush(); while ((str = sockin.readLine()) != null) { System.out.println(str); } sock.close(); } catch (Exception ex) { ex.printStackTrace(); } System.out.println("どのメールを見ますか?"); BufferedReader numin = new BufferedReader(new InputStreamReader(System.in)); num = numin.readLine(); try { sock = new Socket(server, port); sockin = new BufferedReader(new InputStreamReader(sock.getInputStream())); sockout = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream())); sockout.write("USER " + user + "\r\n"); sockout.flush(); sockout.write("PASS " + pass + "\r\n"); sockout.flush(); sockout.write("LIST\r\n"); sockout.flush(); sockout.write("QUIT\r\n"); sockout.flush(); while ((str = sockin.readLine()) != null) { System.out.println(str); } sock.close(); } catch (Exception ex) { ex.printStackTrace(); } System.out.println("どのメールを見ますか?"); BufferedReader numin = new BufferedReader(new InputStreamReader(System.in)); num = numin.readLine(); try { sock = new Socket (server, port); sockin = new BufferedReader(new InputStreamReader(sock.getInputStream())); sockout = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream())); sockout.write("USER " + user + "\r\n"); sockout.flush(); sockout.write("PASS " + pass + "\r\n"); sockout.flush(); sockout.write("RETR " +num+"\r\n"); sockout.flush(); sockout.write("QUIT\r\n"); sockout.flush(); while ((str = sockin.readLine()) != null) { System.out.println(str); } sock.close(); } catch (Exception ex) { ex.printStackTrace(); } } }

    • ベストアンサー
    • 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は存在しています。 非常に困っています。

  • ftpサーバからのレスポンスメッセージをすべて取得したところで処理が進まなくなる

    下記のようなプライベートメソッドにおいて FTPサーバからのレスポンスメッセージをコンソールに表示し FTPのやりとりを確認しているのですが、 すべてのレスポンスメッセージを表示し切ったあと、 最後に再びreadLine()を呼び出すところでそのまま動かなくなります。 (Eclipseのデバッグからステップ実行で確認しております) private void writeResponseMsg(BufferedReader reader) throws Exception {  String strLine = new String();  while ((strLine = reader.readLine()) != null){ // ←この位置で止まる。   System.out.println(strLine);  } } 例えば、下記のようなFTPサーバにログインしたときのレスポンスの表示に上記メソッドを利用すると コンソールには正しくすべてのメッセージを表示するのですが 最後のメッセージを取得し終わったあとにreadLine()からnullが返ってくることはなく、 その位置から処理が動きません。 = = = = = メイン処理 = = = = = Socket socket = new Socket(hostName, portNo); PrintWriter writer = new PrintWriter(socket.getOutputStream()); BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); writer.println("USER " + loginID); writer.flush(); writer.println("PASS " + password); writer.flush(); writeResponseMsg(reader); = = = = = コンソール = = = = = 220 (vsFTPd 2.0.1) 331 Please specify the password. 230 Login successful. 何かソースコードの誤りや解決方法をご存知の方がいらっしゃいましたら ご指導よろしくお願い申し上げます。 = = = = = 利用環境 = = = = = Java J2SE 1.5.0.14 FTPサーバ vsftpd 2.0.1 Eclipse 3.2.1 以上

    • ベストアンサー
    • Java
  • javaでWebサーバー

    今学校の課題でjavaで簡単なWebサーバーを作っています トップディレクトリのdocrootフォルダ下のファイルにアクセスできるようにしました 内容は以下の様です import java.io.File; import java.net.Socket; import java.net.ServerSocket; /** * 簡単なWebサーバ. */ public class HTTPServer { /** * サーバソケット */ private ServerSocket server; /** * Webサイトのトップディレクトリ */ private String docRoot; /** * サーバーソケットを作成する。 * @param port このサーバが受け付けるポート番号 * @param docRoot Webサイトのトップディレクトリ */ private HTTPServer(int port, String docRoot) throws java.io.IOException { server = new ServerSocket(port); this.docRoot = docRoot; } /** * サーバのサービスを行うメソッド. */ private void doService() { System.out.println("Starting Server Service!!"); while (true) { try { Socket client = server.accept(); ClientHandler clientHandler = new ClientHandler(client, docRoot); clientHandler.doService(); } catch (Exception e) { // スタックトレースの表示 e.printStackTrace(); } } } /** * サーバ起動のための主メソッド. * 起動方法:トップディレクトリにて * <pre> * java -cp lib pro3.HTTPServer ポート番号 * </pre> */ public static void main(String[] args) { if (args.length != 1) { System.err.println("usage: java HTTPServer port_number"); System.exit(1); } int port = -1; try { port = Integer.parseInt(args[0]); // 文字列を整数へ変換 } catch (Exception e) { System.err.println("Invalid port number."); System.exit(1); } // Webサイトのトップディレクトリ(カレントディレクトリのdocroot)を求める. String docRoot = System.getProperty("user.dir") + File.separator + "docroot"; try { HTTPServer server = new HTTPServer(port, docRoot); server.doService(); } catch (Exception e) { // スタックトレースの表示 e.printStackTrace(); } } } doServiceで指定したファイルを読んで返したりしています ここで質問なのですが このサーバーを動かしている時に http://localhost:ポート/index.html でアクセスするたびにindex.htmlをきちんと出力してくれます しかしソースを読む限りだとループしているようには思えないのですが どのように繰り返しを行っているのですか?

    • ベストアンサー
    • Java
  • java わからない。

    今、卒業研究でJAVAを扱っています。 しかし、思った動作をするプログラムが作れません。 時間もなくなってきたので、okwaveに投稿しました。 お願いします。 パソコンはwindowsです。 プログラムを実行すると, (1)コマンドプロセッサでdirを実行してくれる。 (2)実行した後にファイルにする。 実行するときは[dir > dir.txt]のようにしたいです。 今まで書いてきた例をいかに描きます。 import java.io.*; public class TestExec1 { public static void main(String[] args) { try { String s1 = "dir"; Process process = Runtime.getRuntime().exec(s1); InputStream is = process.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); String line; while ((line = br.readLine()) != null) { System.out.println(line); } } catch (Exception e) { e.printStackTrace(); } } } どこが間違っているかわかりません。 よろしくお願いします。

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

  • プログラムからの返答の意味がわかりません..

    import java.io.*; public class Teme { public static void main(String [] args) { String [] command = { "C:\\Users\\yuzumodoki\\Desktop\\chunkparser-1.0\\chunkparser-1.0\\parser.exe", "aaaa" }; // 外部プログラムを実行 Runtime runtime = Runtime.getRuntime(); Process process = null; try { process = runtime.exec(command); } catch(Exception exception) { System.err.println(exception.getMessage()); exception.printStackTrace(); System.exit(-1); } // 外部プログラムの標準出力から読み込み BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream())); System.out.println(br); try { String line; while((line = br.readLine()) != null) { System.out.println(line); } } catch(Exception exception) { System.err.println(exception.getMessage()); exception.printStackTrace(); System.exit(-1); } finally { try { br.close(); } catch(Exception exception) { System.err.println(exception.getMessage()); exception.printStackTrace(); System.exit(-1); } } } } 上記のプログラムはparser.exeにアクセスし,そのアプリケーションに文字列を送り,処理をしてその結果を取得するというものです. 本来"aaaa"と送ると"(aaaa aaaa)"と返ってくるプログラムなのですが, java.io.BufferedReader@89ae9e と返ってきます.これはなぜだかわかる方いらっしゃいますか?また,aaaa aaaaと本来の値を返すにはどうすればいいかわかる方いらっしゃいませんか.. もしわかる方いらっしゃたら教えて頂けたらすごくうれしいです(つj)

  • javaのファイル読み込み処理の質問です

    あるディレクトリから.txtファイルを検索し 検索して出た結果を1つずつ読み込んでいきたいです どのようにしたらよいのでしょうか? private static String path="C:\\textfolder "; public static voif main(String[] args) { File dir = new File(path); File[] files = dir.listFiles(); String fileName = dir.getName(); for (int s = 0; s < files.length; s++) { try {//ファイルオープン BufferedReader br = new BufferedReader(new FileReader(fileName)); } } catch (IOException e) { e.printStackTrace(); } } return; } } 現状はこのような感じになっています pathの中身はディレクトリのパスを指定しています。 ディレクトリはC:\textfolder でtextfolderというフォルダに.txt(拡張子)のファイルが複数あったとします。

    • ベストアンサー
    • Java