外出自粛中でも楽しく過ごす!QAまとめ>>

mainメソッドのthrows節で設定した例外はどこでcatchされる?

java初心者です。

例えば、mainメソッドの中でAというメソッドが呼ばれるとします。
そのAについての宣言文(定義文)にthrows節が書かれているような場合、
mainメソッド内で、Aを呼び出す際、Aの実行の中で、もし例外が発生した場合には、
mainでその例外をキャッチして処理するよう、mainの記述を行う必要があるかと思います。

では、mainメソッド自体に設定したthrows節(つまり、
public static void main(String[] args) throws TestException{ ~略~ } という宣言)
については、
その例外(ここでは、TestException)は、どこでcatchすることになるのでしょうか?

もしや、「投げっぱなし」ということなのでしょうか?

mainメソッド自体は、基本的に他のメソッドから呼ばれるものではないかと思うので、
mainメソッドでスローした例外の受け取り場所がわからなくて質問させていただきました。

色々調べたつもりなのですが、よくわからなくて困ってしまいました。
あまりに初歩すぎて、どこにも書かれていないのかなんなのか、
その説明が見当たらないこと自体にも、疑問を感じている次第です。苦笑

以上、どなたか、宜しくお願い致します。

A 回答 (1件)

そのもしやの「投げっぱなし」です。

mainメソッドの場合に限らず、throwされた例外をcatchするメソッドがない場合には標準エラー出力にその例外を表示して、該当スレッドの実行はそこで終了です。

public class QA6049493 {
public static void main(String[] args) throws Exception {
throw new Exception("from main");
}
}

>java QA6049493
Exception in thread "main" java.lang.Exception: from main
at QA6049493.main(QA6049493.java:3)
    • good
    • 0
この回答へのお礼

ま、まさか、そんなことになっていたなんてっ、、、。
大変よくわかりました、ありがとうございました。
とても助かりました。

お礼日時:2010/07/19 21:04

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

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

QIOException ってどういうときに起こるのでしょうか?

IOException ってどういうときに起こるのでしょうか?

http://www.atmarkit.co.jp/fjava/rensai2/javaent12/javaent12.html
を見て勉強しています。

  catch ( IOException e) {
    System.out.println( "キーボードが故障しているのかもしれません" );
  }

と書いてあります。
ハード(キーボード)が故障しているのを Java のプログラムのレベル(ソフトウェア)で感知できるというのがよくわかりません。「

NumberFormatException の方はわかるのですが・・・

Aベストアンサー

現実的には、キーボードからの入力でIOExceptionが発生することは、
ほとんどあり得ないと思います。
そもそも、キーボードが故障していたとしても、
IOExceptionは投げられないでしょう。
「キーボードが故障しているのかもしれません」というのは、
その記事の著者が冗談で書いたのだと思います。

ではなぜ、try-catchを書かなくてはいけないのか?
InputStreamやBufferedReaderは、
データ入力を抽象化したものだからです。
実際の入力元はキーボードだったり、ファイルだったり、
ネットワーク接続だったりするわけですけど、
InputStreamは、その入力元の情報を持っていないので、
データを読み取る際は常に
IOExceptionをキャッチするコードを書かなくてはいけません。
たとえ、絶対にIOエラーが発生しないストリームだとしても。

さらに付け加えるなら、
そもそも「標準入力=キーボード」であるとは限りません。
(一般的にはキーボードであることが多いですが。)
Javaでは、
System.setIn(InputStream)
を呼び出して、標準入力を変えてしまうことができますし、
標準入力を指定してプログラムを実行することができるOSもあります。

追伸1:
例外をキャッチしたときは、
スタックトレースをプリントすることをおすすめします。
catch (IOException e) {
e.printStackTrace();
}

追伸2:
そのプログラムでIOExceptionを発生させる最も簡単な方法は、
readLine()を呼び出す前に
標準入力(System.in)を閉じてしまうことです。
System.in.close();

現実的には、キーボードからの入力でIOExceptionが発生することは、
ほとんどあり得ないと思います。
そもそも、キーボードが故障していたとしても、
IOExceptionは投げられないでしょう。
「キーボードが故障しているのかもしれません」というのは、
その記事の著者が冗談で書いたのだと思います。

ではなぜ、try-catchを書かなくてはいけないのか?
InputStreamやBufferedReaderは、
データ入力を抽象化したものだからです。
実際の入力元はキーボードだったり、ファイルだったり、
ネットワーク接...続きを読む

Qpublic static void main (String args[])

基本すぎて申し訳ありませんが、
public static void main (String args[])とはどういう意味を持っていますか?
教えてください。。

Aベストアンサー

staticとかの意味はNo1の方の説明以外にありません。

mainは最初に実行されるメソッドという説明がされますので、「クラスを実行する時の引数とは?」と引っかかっているのかもしれませんね。
これはコマンドライン引数と呼ばれます。

たとえば、次のプログラム

public class ArgsTest{
  public static void main(String[] args){
    System.out.println(args.length);
    for(int i = 0 ; i < args.length ; i++){
      System.out.println(args[i]);
    }
  }
}

これを
>java ArgsTest abcde fghij(エンター)
として実行するとabcdeとfghijが引数となります。

ちなみに、mainはpublicでstaticなメソッドなので、
public class ArgsTest2{
  public static void main(String args[]){
    tamesi();
  }
  void tamesi(){
    String[] test = {"abcde","fghij"};
    ArgsTest.main(test);
  }
}
のように、外部のクラスからクラス名.mainで呼び出せます。(この2つのプログラムは、私が悩んだ時に試しにつくったものです)

ちなみにargsはarguments(=引数)の略で、mainの引数として、よく使われます。
argvのほうはargument valueの略です。C言語を使っていた人の中にはargvを使う人がいるかもしれません。

staticとかの意味はNo1の方の説明以外にありません。

mainは最初に実行されるメソッドという説明がされますので、「クラスを実行する時の引数とは?」と引っかかっているのかもしれませんね。
これはコマンドライン引数と呼ばれます。

たとえば、次のプログラム

public class ArgsTest{
  public static void main(String[] args){
    System.out.println(args.length);
    for(int i = 0 ; i < args.length ; i++){
      System.out.println(args[i]);
    }
  }
}

...続きを読む

QEclipseで、プロジェクト名のところに赤いバッテンのエラーマークが

Eclipseで、プロジェクト名のところに赤いバッテンのエラーマークがついていますが、どのソースファイルにも赤いエラーマークは無く、なぜエラーになっているのか分かりません。

どこでエラーが出ているのか調べる方法はあるでしょうか?

Aベストアンサー

ウインドウ → ビューの表示 → 問題
をクリックすれば問題のある箇所が表示されるはずです

Qシンボルが見つかりませんというエラーが理解できません。

以下のようなじゃんけんゲームのプログラムを書いたのですが、「シンボルが見つかりません。」というエラーが表示されるのですが、エラーの意味が理解できず、解決できません。どこが間違っているのか教えていただけませんか。

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.io.File;

public class janken extends Applet
implements Runnable, ActionListener {
private static final int EXTERNAL_BUFFER_SIZE = 128000;

Image image[] = new Image[3];
Thread t;
int index1 = 0;
int index2 = 0;
String msg = "";
String msg1 = "";

boolean state = false;
Button b1 = new Button("ぐー");
Button b2 = new Button("ちょき");
Button b3 = new Button("ぱー");

public void init(){
for(int i = 0; i<=2; i++){
img[i] = getImage(getDocumentBase(),"hanabi" + (i+1) + ".JPG");
}
add(b1);
add(b2);
add(b3);
b1.addActionListener(this);
b2.addActionListener(this);
b3.addActionListener(this);
msg1 = "結果は・・";

}

public void paint(Graphics g){
g.drawImage(img[index1],350,30,this);
g.drawImage(img[index2],695,30,this);
g.drawString("コンピューター",420,300);
g.drawString("あなた",800,300);
g.drawString(msg,630,320);
g.drawString(msg1,550,320);
}

public void start(){
state = true;
t = new Thread(this);
t.start();

}

public void run(){
while(state){
index1++;
if(index1 == 3){
index1 = 0;
}
index2++;
if(index2 == 3){
index2 = 0;
}
repaint();
try {
Thread.sleep(60);
}catch(InterruptedException e) { }
}
}

public void actionPerformed(ActionEvent e){
if(state == false) {
start();
return;

}
state = false;
if(e.getSource() == b1) {
msg = "ぐー";
index2 = 0;
}

else if(e.getSource() == b2){
msg = "ちょき";
index2 = 1;
}

else if(e.getSource() == b3){
msg = "ぱー";
index2 = 2;
}
check();
repaint();
}

public void check() {
if(index1 == index2) msg ="あいこ";


else if (index1 == 0) {
if(index2 == 2) msg="あなたの勝ち";
else msg ="あなたの負け";
}

else if(index1 == 1) {
if(index2 == 0) msg="あなたの勝ち";
else msg="あなたの負け";
}

else if(index1 == 2) {
if(index2 == 1) msg="あなたの勝ち";
else msg="あなたの負け";
}

}
}

以下のようなじゃんけんゲームのプログラムを書いたのですが、「シンボルが見つかりません。」というエラーが表示されるのですが、エラーの意味が理解できず、解決できません。どこが間違っているのか教えていただけませんか。

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.io.File;

public class janken extends Applet
implements Runnable, ActionListener {
private static final int EXTERNAL_BUFFER_SIZE = 128000;

Image image[] = new Imag...続きを読む

Aベストアンサー

「シンボルを見つけられません。」というエラーの下に何か表示がありませんでしたか?そこにヒントがあると考えられます。
シンボルを見つけられませんといエラーが表示される主な理由は4つあります。
(1)クラス、メソッド、変数などの綴りミスや定義していない変数を使用している可能性がある。
(2)コンストラクタを呼び出すときに、newを忘れている可能性がある。(3)公開されていないメンバーを呼び出している可能性がある。
(4)必要なimport文を記述し忘れている可能性がある。
ここでのあなたのエラーは(1)番ではないでしょうか?上記ではimageとなっている変数がimgになっていますね。
これはエラー表示をよく見ることで意外と簡単に解決できるのです。
ゆっくり丁寧にエラー表示を見るように心がけることが大事ですよ。

Q(String args[])というメッソッドの意味

JAVAの初心者です、宜しくお願いします。
アプリケーションのプログラムで、Static Void (String args[])というメッソッドがありますがこれは一体何をさせるものですか。

また色々と本読んでいると、Static Void (String[] args)と配列を設定している場合もあります。
良く理解できません。ベーシックは理解できるのですが。宜しくお願いします。

Aベストアンサー

まず最初に、お勧め過去ログです。

[mainメソッド(コンパイルは出来るが、実行不可。)]
http://oshiete1.goo.ne.jp/kotaeru.php3?q=55027
[mainメソッド(クラスメソッドとしての利用。)]
http://oshiete1.goo.ne.jp/kotaeru.php3?q=1876924

そこそこJavaの勉強をしてきて、上記じゃ物足りないなあという方向け

[公式サイト]
http://java.sun.com/j2se/1.5.0/ja/docs/ja/tooldocs/windows/java.html
[Java言語規定の「12.実行」]
http://www.y-adagio.com/public/standards/tr_javalang/12.doc.htm
[Javaコマンドの基本]
http://www.stackasterisk.jp/tech/java/javaCommand01_01.jsp

あと、今だと都会の大型書店に行けば、日経ソフトウエアの2006年11月号がまだ山積みされていることと思います。ここの「特集4 Java開発者必見! 仮想マシンの仕組みを理解する」の所には、JVMが実際にどのように動いているのかとか、javapコマンドの簡単な使い方などが載っていますので、そちらの方も参考にしてください。

http://www15.nikkeibp.co.jp/software/backno/2006/0611indexc.html

まず最初に、お勧め過去ログです。

[mainメソッド(コンパイルは出来るが、実行不可。)]
http://oshiete1.goo.ne.jp/kotaeru.php3?q=55027
[mainメソッド(クラスメソッドとしての利用。)]
http://oshiete1.goo.ne.jp/kotaeru.php3?q=1876924

そこそこJavaの勉強をしてきて、上記じゃ物足りないなあという方向け

[公式サイト]
http://java.sun.com/j2se/1.5.0/ja/docs/ja/tooldocs/windows/java.html
[Java言語規定の「12.実行」]
http://www.y-adagio.com/public/standards/tr_javalang/12.doc.ht...続きを読む

Qsqlplusで表示が変なので、出力を整形したい。

いつもお世話になっています。

サーバにアクセスしてsqlplusで、
データを調べたいのですが、
出力形式が見づらくて困っています。

よくわからいのですが、
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
---------------------------
1の値 2の値
3の値
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
---------------------------

上記のように意味不明な形式で出てきます。

例えばこんな風に

select カラム1,カラム2,カラム3 from hoge;

カラム1 1の値
---------------------------
カラム2 2の値
---------------------------
カラム3 3の値

等のように分かりやすく表示できないでしょうか?

ちなみにOracle9iR2を使用しています。
sqlに関するツールは使用できないルールでして、あくまでsqlplusのコマンド上でみやすくしなければなりません。

分かりづらくですいませんが、皆さま、ご教授お願いします。

いつもお世話になっています。

サーバにアクセスしてsqlplusで、
データを調べたいのですが、
出力形式が見づらくて困っています。

よくわからいのですが、
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
---------------------------
1の値 2の値
3の値
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
-----------------------...続きを読む

Aベストアンサー

SQLPLUSを起動して、

SQL>set linesize 列数

でどうだ。

SQL>show linesize

で確認ができる。

QJava「デフォルトのパッケージ」の意味が分かりません。

 Java「デフォルトのパッケージ」の意味が分かりません。
http://takeoba.cool.ne.jp/java/packageDeclaration.htm


パッケージ宣言しないプログラムは、デフォルトのパッケージに割り当てられます。

と書かれているのですが「デフォルトのパッケージ」の意味が分かりません。
 Googleで「Java デフォルトのパッケージ」を検索してもヒットする件数は多いのですが「デフォルトのパッケージ」の意味そのものに触れたものがなかなか見つかりません。
 Javaに詳しい方、よろしくお願いいたします。

Aベストアンサー

なんというか、パッケージを「クラスファイルの保存場所」と思われてしまうとまずいので、微妙に追加を。

まず、パッケージというのは何のためのものか、それをご理解ください。これは、クラスファイルの保存場所に関するものではありません。パッケージというのは、クラスに名前空間を与え管理するためのものです。わかりやすくいえば、ファイルをフォルダで分類して整理できるのと同じように、すべてのクラスを、場所を指定して管理できるようにするための仕組みのことです。

Javaでは、クラス名を記述してプログラムを動かしますね? では、同じクラスが複数あったらどうなるでしょうか? Javaはそれらを区別することができなくなります。が、実質問題として、さまざまな人間がすべて異なる名前でクラスを定義するとは思えません。そこで、クラスを保存する場所を階層的に指定し、「このクラスは、jp.hoge.hogeという場所にあるクラスですよ」ということを示して扱えるようにしたわけです。これが「パッケージ」です。

実際、標準で付いてくるクラスを見ると、java.awt.Buttonというように、パッケージの中に収めてあることがわかります。が、こうなると今度は「ちょっとプログラムを試しに動かしたいのに、わざわざ他とは重複しないパッケージを定義して動かさないといけないのは面倒だ」ということになります。そこで、「それじゃあ、何もパッケージを指定しないで作ったクラスは、仮にデフォルトパッケージというパッケージを用意して、その中にあるという扱いにしよう」ということで考えられたのがデフォルトパッケージです。

パッケージを指定したクラスは、(アーカイブ化していなければ)それぞれの階層がフォルダとして用意された形で保存されます。例えば、jp.hoge.Testならば、「jp」フォルダ内に「hoge」フォルダがあり、その中に「Test.class」が保存されます。が、パッケージ指定していなければ、(階層がありませんから)フォルダなどなく、その場に保存されます。classファイルのある場所が、デフォルトパッケージのクラスが保管されている場所と判断されるわけです。が!「保存されているフォルダがパッケージのことだ」とは思わないでください。これは、ただの「現象」です。たまたま、現在のJavaはそういう形でファイルを保存するようになっている、というだけのことです。パッケージは、あくまで「プログラム上に用意される空間」です。ファイルの保管場所のことではありません。

デフォルトパッケージというものが用意されている理由は、「Javaのクラスは、必ずどこかのパッケージに置かれなければならない」からです。パッケージのないクラスは存在できません。なぜなら、Javaの言語仕様に、パッケージの存在がかかわっているからです。例えば、クラスを定義するのに「public」をつけますが、これが付いていないと「同一パッケージ内についてpublic」と扱われます。つまり、「パッケージ内のクラスとパッケージ外のクラス」で利用が異なるような仕様が文法に既に用意されているのです。このため、必ずクラスはどこかのパッケージに属さなければなりません。それで、まったくパッケージを指定していないものも、デフォルトパッケージというパッケージに所属するという形で扱われるようになっているのです。

なんというか、パッケージを「クラスファイルの保存場所」と思われてしまうとまずいので、微妙に追加を。

まず、パッケージというのは何のためのものか、それをご理解ください。これは、クラスファイルの保存場所に関するものではありません。パッケージというのは、クラスに名前空間を与え管理するためのものです。わかりやすくいえば、ファイルをフォルダで分類して整理できるのと同じように、すべてのクラスを、場所を指定して管理できるようにするための仕組みのことです。

Javaでは、クラス名を記述し...続きを読む

Qjavaで配列の中身を表示する方法

こんばんは。
私は、PHPをやっていたのですが、今度はjavaにチャレンジしてみたいと思っています。
それで、質問です。
PHPでは重宝していたのですが、print_r()メソッドにあたるメソッドはないでしょうか?
このメソッドは、配列やオブジェクトの中身を全て出力してくれるメソッドなのですが…。配列の構造が見たいときなどはとても重宝しました。

ex)
■プログラム
$arr = array(1, 2, 3, 4, 5);
print_r($arr);

■結果:
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
)

ご存知の方いらっしゃいまいしたら、教えてください。

Aベストアンサー

> print_r()メソッドにあたるメソッド
Javaのメソッドは、なにかのオブジェクトまたはなにかのクラスのメソッドだから、便利に使える一人歩きメソッドはないですね。また、配列の中身はオブジェクトであることが多いしオブジェクトの仕様はさまざまなので、単純で一律的なprintもあり得ないでしょうね。

有意義なtoString()メソッドが定義されているオブジェクトの配列なら:
System.out.println(Arrays.asList(myArray));
とやる手はありますね。

Javaの新しいforループ:
for (int i : arr){
System.out.println(i);
}
も便利です。

Q日付型カラムへのデータINSERT

お世話になります。ひとつご教授ください。

オラクル10g, ojdbc14でjdk1.4.2から接続です。

INSERT命令を使ってテーブルにレコードを追加する際に、DATE型のカラムに対して

INSERT TABLE_A (DATE1, ...) VALUES ('2006-4-27 12:00:00', ...);

を実行するとエラーORA-01861が出ます。そこで

INSERT TABLE_A (DATE1, ...) VALUES ('2006-4-27', ...);

このように記述して再度実行すると通ります。

このようなとき、時間の部分まで設定した値をカラムに格納したいときはどうしたらよろしいでしょうか?

よろしくお願いします。

Aベストアンサー

ごめんなさい。
説明と文例が違ってしまいました。
正しくはこちらです。

INSERT TABLE_A (DATE1, ...) VALUES (to_date('2006-4-27 12:00:00','yyyy/mm/dd hh24:mi:ss'), ...);
というように、to_date関数を使うのが一般的かと思います。

Q生成したインスタンスを削除する方法

言語:JAVA

生成したインスタンスを削除するにはどのようにすれば良いでしょうか?

testData = new TestData();

testDataはセッション内に格納してあります。
また、testDataはNULLのままだったり、実際に値が入っていたりもします。

NULLのままだと不具合があるため、NULLの場合は、インスタンスそのものを削除してしまいたいと考えています。
初歩的な質問ですみませんが、教えてください。

よろしくお願いいたします。

Aベストアンサー

浅学なため、TestDataというクラス名と「セッション内に格納」という表現だけからどうしてHttpSessionが出てくるのか分かりませんが...

Javaでは、明示的な操作(C++のdeleteのような)によってインスタンスを削除することはできません。そのインスタンスがどこからも参照されなくなったらGCで消えます。もう要らない(消えてほしい)インスタンスを参照している変数やフィールドにはnullを代入することで参照をなくします。

testData = null;

> NULLのままだと不具合があるため、NULLの場合は、インスタンスそのものを削除してしまいたい

何がNULLだとどのように不都合なのかを説明してもらえると、別の回答がつくかもしれません。