120
class throwseg1
{
    void show() throws Exception
    {
        throw new Exception("my.own.Exception");
    }

    void show2() throws Exception  // Why throws is necessary here ?
    {
        show();
    }

    void show3() throws Exception  // Why throws is necessary here ?
    {
        show2();
    }

    public static void main(String s[]) throws Exception  // Why throws is necessary here ?
    {
        throwseg1 o1 = new throwseg1();
        o1.show3();
    }
}

コンパイラがそのメソッドshow2()を報告する理由、、、show3()およびmain()

報告されていない例外キャッチするか、スローするように宣言する必要がある例外

throws Exceptionこれらのメソッドから削除するとどうなりますか?

4

8 に答える 8

170

Javaでは、ご存知かもしれませんが、例外は2つに分類できます。1つはthrows句が必要か、もう1つは指定しない場合は処理する必要があります。次の図を参照してください。

ここに画像の説明を入力してください

ThrowableJavaでは、クラスを拡張するものなら何でもスローできます。throwsただし、すべてのクラスに句を指定する必要はありません。具体的には、これら2つのサブクラスのいずれErrorかまたはいずれかであるクラス。RuntimeExceptionあなたの場合、またはExceptionのサブクラスではありません。したがって、これはチェックされた例外であり、その特定の例外を処理しない場合は、句で指定する必要があります。そのため、この条項が必要でした。ErrorRuntimeExceptionthrowsthrows


Javaチュートリアルから:

例外は、プログラムの実行中に発生するイベントであり、プログラムの命令の通常のフローを中断します。

ご存知のように、例外はチェックされているものとチェックされていないものの2つに分類されます。なぜこれらの分類?

チェックされた例外:プログラムの実行中に回復できる問題を表すために使用されます。それらは通常、プログラマーのせいではありません。たとえば、ユーザーが指定したファイルが読み取れない、ネットワーク接続が利用できないなどです。これらすべての場合、プログラムを終了する必要はありません。代わりに、ユーザーに警告するなどのアクションを実行したり、フォールバックに入ることができます。メカニズム(ネットワークが利用できない場合のオフライン作業など)など。

未チェックの例外:エラーとRuntimeExceptionsの2つに分けることができます。それらがチェックされていない理由の1つは、それらの数が多く、それらすべてを処理する必要があると、プログラムが乱雑になり、その明確さが低下するためです。他の理由は次のとおりです。

  • ランタイム例外:通常、プログラマーの障害が原因で発生します。たとえば、ArithmeticExceptionゼロ除算が発生したArrayIndexOutOfBoundsException場合、または発生した場合、コーディングに十分な注意が払われていないことが原因です。これらは通常、プログラムロジックにエラーがあるために発生します。したがって、プログラムが本番モードに入る前に、これらをクリアする必要があります。これらは、プログラムが発生したときに失敗する必要があるという意味でチェックされていません。これにより、プログラマーは開発およびテスト時にプログラムを解決できます。

  • エラー:エラーは、通常、プログラムが回復できない状況です。たとえば、StackOverflowErrorが発生した場合、プログラムの関数呼び出しスタックのサイズを増やすなど、プログラムは多くのことを実行できません。または、OutOfMemoryError発生した場合、プログラムで使用できるRAMの量を増やすために多くのことを行うことはできません。このような場合は、プログラムを終了することをお勧めします。そのため、チェックを外します。

詳細については、以下を参照してください。

于 2012-07-21T04:11:04.287 に答える
32

Javaでは、すべての例外を処理または宣言する必要があります。try / catchブロックを使用して例外を処理していない場合は、メソッドのシグネチャで宣言する必要があります。

例えば:

class throwseg1 {
    void show() throws Exception {
        throw new Exception();
    }
}

次のように書く必要があります:

class throwseg1 {
    void show() {
        try {
            throw new Exception();
        } catch(Exception e) {
            // code to handle the exception
        }
    }
}

このようにして、メソッド宣言の「throwsException」宣言を取り除くことができます。

于 2012-07-21T04:13:38.323 に答える
6

throws Exception宣言は、予想されるが避けられない理由で例外をスローする可能性のあるメソッドを追跡する自動化された方法です。throws IOException宣言は通常、またはなどのスローされる可能性のある1つまたは複数の例外のタイプに固有throws IOException, MyExceptionです。

ゼロ除算や範囲外のインデックスなど、プログラムを実行する前に予期していなかったことが原因で、予期せず停止し、例外を報告するコードを作成するか、最終的に作成する予定です。エラーはメソッドで予期されていなかったため、「キャッチ」してtrycatch句で処理することはできませんでした。メソッドの疑いを持たないユーザーもこの可能性を知らず、プログラムも停止します。

プログラマーが特定のタイプのエラーが発生する可能性があることを知っているが、メソッドの外部でこれらの例外を処理したい場合、メソッドは、それらを処理する代わりに、呼び出し元のメソッドに1つ以上のタイプの例外を「スロー」できます。メソッドが例外をスローする(可能性がある)ことをプログラマーが宣言しなかった場合(またはJavaに例外を宣言する機能がなかった場合)、コンパイラーはそれを知ることができず、メソッドの将来のユーザーが知る必要があります。メソッドがスローする可能性のある例外をキャッチして処理します。プログラムには多くの異なるプログラムによって記述されたメソッドの多くの層が含まれる可能性があるため、どのメソッドが例外をスローする可能性があるかを追跡することは困難(不可能)になります。

Javaには例外を宣言する機能がありますが、未処理および未宣言の例外を使用して新しいメソッドを作成できます。Javaはそれをコンパイルし、実行して最高のものを期待できます。Javaで許可されないのは、例外をスローするものとして宣言されたメソッドを使用する場合、メソッドで宣言された例外を処理するか、メソッドを同じものをスローするものとして宣言しない限り、新しいメソッドをコンパイルすることです。例外または複数の例外がある場合は、一部を処理して残りをスローできます。

メソッドが特定のタイプの例外をスローすることをプログラマーが宣言する場合、それは、メソッドを使用する他のプログラマーに例外が発生する可能性があることを警告する自動化された方法にすぎません。次に、プログラマーは、呼び出し元のメソッドも同じ例外をスローすることを宣言することにより、例外を処理するか、警告を渡すかを決定できます。コンパイラは、この新しいメソッドで例外が発生する可能性があることを警告されているため、新しいメソッドの将来の呼び出し元が例外を処理するかどうかを自動的にチェックするか、例外を宣言していずれかを強制的に発生させることができます。

このタイプのソリューションの良いところは、コンパイラーが報告Error: Unhandled exception type java.io.IOExceptionすると、例外をスローするように宣言されたメソッドのファイルと行番号を提供することです。次に、単純にドルを渡すことを選択し、メソッドが「IOExceptionをスローする」ことも宣言できます。これは、メインメソッドまで実行できます。メインメソッドでは、プログラムが停止し、ユーザーに例外が報告されます。ただし、例外をキャッチして、何が起こったのか、どのように修正するのかをユーザーに説明するなど、適切な方法で処理することをお勧めします。メソッドが例外をキャッチして処理する場合、例外を宣言する必要はありません。いわば、ドルはそこで止まります。

于 2013-11-15T18:18:39.427 に答える
4

Exceptionチェックされた例外クラスです。throws Exceptionしたがって、メソッドを処理または宣言する必要があることを宣言するメソッドを呼び出すコード。

于 2012-07-21T03:53:50.630 に答える
0
package javaexception;


public class JavaException {
   void show() throws Exception
    {
        throw new Exception("my.own.Exception");
    }

void show2() throws Exception  // Why throws is necessary here ?
{
    show();
}

void show3() throws Exception  // Why throws is necessary here ?
{
    show2();
}
public static void main(String[] args) {

   JavaException a = new JavaException();

   try{
   a.show3();
   }catch(Exception e){
       System.out.println(e.getMessage());
   }
}

プログラムの小さな変更のみ。主な問題に関して多くの人が誤解しているように思われるのは、例外をスローするたびに、同じ場所で処理する必要はなく、同じ場所で処理する必要があるということです(たとえば、プログラムのshow1,2,3メソッド)が、最初は呼び出し元のメソッドである必要があります'メイン'の内部。一言で言えば、例外が発生する同じメソッドでなくても、「throw」があり、「catch/try」がなければなりません。

于 2018-03-15T08:11:39.153 に答える
0
void show() throws Exception
{
    throw new Exception("my.own.Exception");
}

show()メソッドに例外がチェックされているため、そのメソッドでは処理されていないため、例外を伝播するためにthrowsキーワードを使用します。

void show2() throws Exception //Why throws is necessary here ?
{
show();
}

show2()メソッドでshow()メソッドを使用していて、少なくとも例外を伝播したので、ここで処理する必要があります。ここで例外を処理していない場合は、throwsキーワードを使用しています。これが、メソッドシグネチャでthrowsキーワードを使用する理由です。

于 2018-04-08T17:43:33.997 に答える
0

基本的に、例外をスローするのと同じ場所で処理していない場合は、関数の定義で「例外をスローする」を使用できます。

于 2019-06-18T12:53:21.273 に答える
0

現在のメソッドのシグニチャでthrowsディレクティブを宣言して例外を伝播する場合は、行または呼び出しスタックのどこかで、例外を処理するためにtry/catch構造を使用する必要があります。

于 2019-07-26T12:07:17.157 に答える