Javaの初心者でこまってまして・・・

public void doPost(HttpServletRequest request, HttpServletResponse response){
try{
// コンテンツタイプの設定
response.setContentType("text/html; charset=Shift_JIS");
// 外部出力
PrintWriter out = response.getWriter();

out.println("<html>");・・・(1)
out.println("<head><title>goo!</title></head>");・・・(2)
エラーがおこるような処理・・・(3)
out.println("</html>")・・・(4)

}catch(エラー ex){
out.println("エラーが発生しました。")・・・(5)
}
}

このようなプログラムがあり、(3)でエラーが出たときに
catchした場合(5)のメッセージだけを出力したいのです。
いまは(1)(2)(5)という感じで出力されてしまいます。
flushしてみたりしたのですが うまくいきませんでした。
わかる方おしえていただけますでしょうか

A 回答 (4件)

(1)や(2)にある<html>タグ自体を全く出力したくない、


というふうに私はこの質問を解釈しました。
だとすれば、プログラムの順序がまずいのではないでしょうか。

次のようにしてみてください。
# ただしエラーチェックはこちらでやっていないので、
# スペルミス等はご容赦

public void doPost(HttpServletRequest request, HttpServletResponse response){

response.setContentType("text/html; charset=Shift_JIS");
PrintWriter out = response.getWriter();
StringBuffer buffer = new StringBuffer();

try {
// 例外が発生し得る処理 - (3)
// 出力は out.printlnではなく、
// buffer.append(文字列);
// とすること。
// 改行を挿入するには("\n")を文字列中に紛れ込ませる

out.println("<html>"); // (1)
out.println("なんたらかんたら"); // (2)
out.println(buffer.toString()); // バッファに溜め込んだものを掃き出す
out.println("</html>"); // (4)

} catch(例外 ex) {
out.println("エラーが発生しました。") // (5)
}
    • good
    • 0

これは、PrintWriterがどうこう言うより、Javaの例外のキャッチに関する問題だと思うのですが。

。。

kuro_73さんが示されているように、上のコードでcatch節内に
response.sendRedirect()やgetRequestDispatcher()を使って
既存のページに飛ばすのも1つの方法だと思いますが、


> out.println("<html>");・・・(1)
> out.println("<head><title>goo!</title></head>");・・・(2)

 try{
  エラーがおこるような処理・・・(3)
 } catch (エラー ex) {
  out.println("エラーが発生しました。"); ・・・(5)
 }

> out.println("</html>")・・・(4)
> }catch(エラー ex){
  // I/Oエラー時の処理
> }

といういうふうに、特定の範囲内でエラーが発生し、それに合わせて処理を
行う場合には、その特定の範囲内をtry節で括るのが正しい処理だと思いますが
どうでしょうか?

上記の方法だと、出力されるのは(1)(2)(5)(4)の順番で出力されるはずです。
    • good
    • 0

servletをエラーHTMLにフォワードしてしまえば大丈夫ですよ。


response.sendRedirect("/html/next.html");
とか・・・
    • good
    • 0

一度String型変数などのバッファに溜めて、エラーの起こる処理の後一気にprintln()する、というのでは駄目でしょうか?

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

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

こんにちは、片岡と言います。

プログラム1は、Java言語で学ぶデザインパターン入門(結城浩さん著)の
433ページを参考にして書きました。

私は、プログラム1のclose()の書き方よりもプログラム2のようなclose()の書き方が、
良いと思っています。
なぜならば、プログラム1では、out.writeObject(memento)行の例外によって、
close()が実行されないからです。

私のこの考え方は正しいのでしょうか。
もっと良いclose()の書き方はあるのでしょうか。
ご存知の方はいらっしゃいませんか。

●プログラム1
public class Main {
public static void saveMemento(Memento memento) {
try {
ObjectOutput out = new ObjectOutputStream(new FileOutputStream("game.dat"));
out.writeObject(memento);
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
… //以下略
}

public class Memento implements Serializable {
… //以下略
}


●プログラム2
public class Main {
public static void saveMemento(Memento memento) {
try {
ObjectOutput 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 {
… //以下略
}


なお、私の環境は以下の通りです。
OS: Microsoft Windows XP Professional SP2
開発環境:Eclipse 3.2.2
java: java version "1.4.2_13"

こんにちは、片岡と言います。

プログラム1は、Java言語で学ぶデザインパターン入門(結城浩さん著)の
433ページを参考にして書きました。

私は、プログラム1のclose()の書き方よりもプログラム2のようなclose()の書き方が、
良いと思っています。
なぜならば、プログラム1では、out.writeObject(memento)行の例外によって、
close()が実行されないからです。

私のこの考え方は正しいのでしょうか。
もっと良いclose()の書き方はあるのでしょうか。
ご存知の方はいらっしゃいませんか。

●プロ...続きを読む

Aベストアンサー

>私のこの考え方は正しいのでしょうか。
正しいです。質問者さんが書かれているやり方が一般的です。
念のため書いておきますが、outをtryの外で宣言しないとコンパイルが通りません。

まぁ、あくまでデザインパターンを学ぶための本ですから、細かなコーディングについて気にする必要はないでしょう(疑問を持つことは良いことですが)。

Qタイトルについて

こんにちは。よろしくお願いします。

HPビルダーで商用のHPを作成しています。
検索ロボットにひっかかるように、タイトルやキーワードをタグ入力?していますが、うまくいきません。

<TITLE>○○のお店</TITLE>
↑このタグを入れると、画面最上に「○○のお店」と表示されるようになりますよね?
それが、ビルダーのページ編集中には正常に表示されるのですが、いざアップロードすると表示されません。ソースを見てみても、ビルダーで入力したはずのタイトルやキーワードがみあたりません。
ただHPのアドレスが表示されているだけで・・・
何故なんでしょうか・・・

あまりPCに詳しくないので説明が下手でごめんなさい。
どなたか教えて下さい!!

Aベストアンサー

ソース拝見しました。
ブラウザの一番上、ホームページタイトルにあたるところに表示されないと言うご質問ですよね?

えと、表示されました。
IE6、Firefox、ネスケ7、Opera全て問題なかったです。
どのブラウザで、表示されませんでしたか?
できれば、全部見たいところです。差し支えなければ、アップロード済みのURLを教えてください。

#これは質問とは関係ありませんが、ソースに同じことが何度も書かれていて、無意味な箇所があります。
できる限り整斉しましょう。
⇒4行目の文字コードの箇所、19行目と23行目にも同じ内容が。
21行目と24行目も同じですし、20行目と25行目も…。

Qタイトルを文書内に表示

<TITLE>タイトル</TITLE>を文書内に表示するにはどうしたらよかったでしょうか。
タイトルバーだけでなく、文書の先頭にも表示させたいのですが、javascriptで可能でしょうか。

#HTMLでも可能だったりして?

Aベストアンサー

素直に<BODY>タグの中に<H1>や<FONT size="+3">などを使ってもう一度書いたらどうでしょうか。

変にこってJavascriptやらなんやらを使ってもJavaを使えないブラウザの人には見えませんし、素直に書いてやるのが一番だと思います。

Q内と後のfunctionの違いは?

初歩的な質問かもしれませんが、

<HEAD><SCRIPT>
function・・・・・・・
</SCRIPT></HEAD>
の中に、記述するfunctionと、

</HEAD>
<SCRIPT>
function・・・・・・・
</SCRIPT>
のように</HEAD>後に、記述するfunctonの
違いはなんでしょうか?
働きとは役目とか、動きが違うのでしょうか?
よろしくお願い致します。

Aベストアンサー

<HEAD>パートと<BODY>パートに書いたちがいによって動き
がちがうということはないでしょう。
しかし、<HEAD>パートに置いても<BODY>パートに置いても
どちらでもよいというわけではありません。
説明がながくなりますので、こちらにUPしておきました。
http://www.geocities.jp/b1aise1623/prog/js/tips/701346/func.htm

Qclass Test_A {  main(){}}の実行順序は?

public class Test_A {
public static void main(){

int a = 0;
int b = 1;

}
}
例えば上のようなサンプルで何故 main()がクラスTest_A の中に挟まっているのでしょうか?実行順序としては main()が終了したら、クラスTest_A の方はどうなるのでしょうか? main()からプログラムが始まるのは分かるのですが、その後の動作が分かりません。よろしくお願いします。 

Aベストアンサー

>main()がクラスTest_A の中に挟まっているのでしょうか

Javaは、全てのプロパティ、メソッドはどこかのクラスに属していないといけないからです。
mainメソッドであっても例外ではありません。

>main()からプログラムが始まるのは分かるのですが、その後の動作が分かりません。

これを考える上で最も重要なのはmainメソッドがstaticであることです。
staticなメソッドは、そのクラスのインスタンスを作らなくても、
つまり、new Test_A();としなくても実行することが可能です。
プログラム実行時には、Test_Aクラスのインスタンスは生成されません。
質問のコードでは変数a,bに値が代入され、それで終わりです。

Javaでは、(正確にはJavaVMは)実行するclassファイルにある、
String[]引数を持ったvoid mainメソッドを実行する仕様になっています。
しかし、mainメソッドを実行するときには何のインスタンスも生成されていないので、
何かのインスタンスのメソッドを実行することはできません。
なので、staticなメソッドでないとJavaVMが実行できないのです。
さらに、JavaVMからアクセス可能なスコープを与える必要があるので、
publicである必要もあるのです。

あとは、そのmainメソッドに指定されたコードを実行し、mainメソッドの最後まで処理が進んだら
そこでJavaVMが終了し、プログラムも終了します。

※細かい話ですが、main()からプログラムは始まりません。
正確に言うと、引数なしのmain()メソッドは他のメソッドと何ら代わりがありません。
プログラムを始めるには、
アクセススコープがpublicで、staticな戻り値のなく、引数にString配列を取るmainメソッド
であることが必要です。つまり、
public static void main(String[] args)
とするのが通常です。
試しに質問のコードをjavaコマンドで実行すると、NoClassDefFoundErrorが出るはずです。

>main()がクラスTest_A の中に挟まっているのでしょうか

Javaは、全てのプロパティ、メソッドはどこかのクラスに属していないといけないからです。
mainメソッドであっても例外ではありません。

>main()からプログラムが始まるのは分かるのですが、その後の動作が分かりません。

これを考える上で最も重要なのはmainメソッドがstaticであることです。
staticなメソッドは、そのクラスのインスタンスを作らなくても、
つまり、new Test_A();としなくても実行することが可能です。
プログラム実行時...続きを読む


人気Q&Aランキング

おすすめ情報