throw とは「投げる、投げる、投げる」という意味です。 Throw、Throws、および Throwable はすべて例外処理に使用されます。
Throwable は Java の例外処理ブランチの最上位の親クラスです。他のすべての例外処理の実装は Throwable に依存しています
公式を開くJava ドキュメント (Java8 バージョン) で、Throwable を見つけてください。その直接のサブクラスは、Error と Exception です。
#エラーと例外の特徴は、エラー例外プログラムでは処理できず、スタック オーバーフローやヒープなどのコードを変更するには手動介入しかできないことです。オーバーフローなど; while Exception 例外を事前に検出し、効果的に対処できます。
エラーのうち、一般的なものには、スタック オーバーフロー、ヒープ オーバーフローなどが含まれます。
たとえば、StackOverflowError
public class ErrorTest { public static void main(String[] args) { main(args); } }
無限再帰の場合、このプログラムを実行すると、スタック オーバーフロー例外が報告されます。
もう 1 つの例は、ヒープ例外 OutOfMemoryError
public class ErrorTest { public static void main(String[] args) { Integer[] testArray = new Integer[1024*1024*1024]; } }
In です。例外 NullPointerException (null ポインター例外)、ArrayIndexOutOfBoundsException (範囲外の配列添字)、NumberFormatException (数値書式設定例外) など、よく知られた例外が多数あります。
public class ExceptionTest { public static void main(String[] args) { int[] testArray = null; System.out.println(testArray[0]); //空指针异常 } }
public class ExceptionTest { public static void main(String[] args) { int[] testArray = new int[3]; System.out.println(testArray[3]); //数组下标越界 } }
public class ExceptionTest { public static void main(String[] args) { String num = "abc"; System.out.println(Integer.parseInt(num)); //数字格式化异常 } }
throws は、このメソッドの実行時に発生する可能性のある例外の種類を示すためにメソッド宣言に適用されます。メソッド実行時に例外が発生すると、例外コードの部分に例外クラスのオブジェクトが生成され、このオブジェクトがThrows以降の例外の型に該当するとスローされます。コードに例外が発生した場合
#1. 例外オブジェクトを生成する;
2. throws この例外をキャプチャし、例外オブジェクトをスローする
# throw と try-catch-finally を合わせて、例外処理の 2 つの方法と呼びます。
try-catch-finally は、例外が発生したときに積極的に例外を処理してプログラムの実行を継続できるようにしますが、 throws は例外をキャッチし、実際には例外を処理せずに例外オブジェクトを上にスローします。
いわゆる例外オブジェクトを上向きにスローすることは、処理のために呼び出し元に例外オブジェクトを渡すことです。たとえば、メソッド A はメソッド B を呼び出し、B は throws を通じて例外をスローし、A は try を使用することを選択できます。例外が実際に処理されるまで、 throws を通じて例外を上向きにスローすることもできます。例外を処理する方法がない場合、最終的に例外オブジェクトが JVM にスローされ、プログラムの実行が停止します。
@Test public void throwsTest(){ //调用者解决抛出的异常 try{ formatChange("abc"); } catch (NumberFormatException e){ System.out.println("转换格式错误!"); } catch (Exception e){ System.out.println("出现错误"); } } private int formatChange(String str) throws NumberFormatException{ //出现异常向上抛出 return Integer.parseInt(str); }
——try-catch-finally または throws を選択する方法は?
メソッドに処理する必要のある例外がある場合、ほとんどの場合、try-catch-finally を選択して例外を直接処理するか、throws を選択して例外を上向きにスローすることができます。呼び出し元に処理を任せます (最後に例外がスローされた場合、その例外を実際に処理する当事者が 1 人必要です。それにどう対処するか? try-catch-finally を使用しましょう)。選択は比較的自由です。ただし、以下の 2 つの状況が発生した場合は、一定のルールに従う必要があります (追加するものがあれば、ご指摘ください)。
親クラスのオーバーライドされたメソッドが throws を使用して例外をスローしない場合、サブクラスによってオーバーライドされたメソッドは throws を使用して例外をスローできません。つまり、この状況ではスローを使用する必要があります。 try-catch-finally で処理します。
メソッド A では、他のいくつかのメソッドが連続して呼び出されます。これらのメソッドは漸進的な関係で実行され、それらの多くには処理が必要な例外があります。この場合、次のことをお勧めします。いくつかの呼び出されたメソッドは、throws を使用して上向きの例外をスローします。メソッド A では、これらの例外を均一に処理するために try-catch-finally が使用されます。
1 つ目に関しては、throws を使用してサブクラスのオーバーライドされたメソッドによってスローされる例外は、親クラスのオーバーライドされたメソッドによってスローされる例外を超えてはいけないという規定です。 . 範囲。たとえば、親クラスのメソッド B が NullPointerException をスローする場合、サブクラスのオーバーライドされたメソッド B は、NullPointerException よりもスコープが広い Exception などの例外をスローできません。親クラスのオーバーライドされたメソッドが例外をスローしない場合は、例外が発生した場合に発生します。の場合、サブクラスは例外をスローできません。 ######なぜ?コードの一部を表示します。
//假设父类中的方法B抛出NullPointerException异常,子类中的方法B可以抛出Exception private void test(ParentClassTest parent){ try{ parent.B(); } catch(NullPointerException e){ System.out.println("出现了空指针异常"); } }
この例では、親クラスのメソッド B が NullPointerException をスローすると仮定すると、サブクラスのオーバーライドされたメソッド B は Exception をスローできます。テスト メソッドに渡されるパラメータが親クラスのインスタンス化されたオブジェクトであれば、テスト メソッドの呼び出しに問題はありません。渡されたパラメータがサブクラスのインスタンス化されたオブジェクトであり、サブクラスによって書き換えられたメソッド B が呼び出された場合、Exception がスローされる可能性があり、try-catch 構造ではこの例外を抑制できません。これは明らかにエラーです。 。
针对第二条,假设方法A中调用了方法C、D、E,这三个方法都有可能产生异常,且存在递进关系,也就是D、E执行需要C执行完成、E执行依赖C、D执行完成。那么就推荐在C、D、E中向上抛出异常,在方法A中集中处理。为什么?如果C、D、E都是向上抛出异常,而A使用try-catch-finally去处理这个异常,如果某个方法真的出现异常,则不再继续执行。而如果C、D、E都使用try-catch-finally直接解决掉异常,那么即使产生了异常,方法A也不会接收到异常的产生,那么还会接着往下执行,但是C出现了异常,再执行D、E没有任何意义。
如果在程序编写时有手动抛出异常的需求,则可以使用throw
throw使用在方法体内。与try-catch-finally和throws都不同,异常处理的两个阶段:1.遇到异常,生成异常对象;2.捕获到异常,进行抛出或处理。try-catch-finally和throws都处在第二个阶段,都是捕获到异常后的相关处理,一般使用系统根据异常类型自动生成的异常对象进行处理。而throw应用在第一阶段,手动地产生一个异常对象。
举一个例子,判断一个数值是否为非负数,如果为负数,则抛出异常。
class ThrowTest{ private int Number; public void judge(int num){ if(num>=0){ this.Number = num; } else{ throw new RuntimeException("传入参数为负数"); } } }
@Test public void test2(){ ThrowTest throwTest = new ThrowTest(); throwTest.judge(-100); }
成功抛出异常。
使用try-catch捕获一下异常。
@Test public void test2(){ ThrowTest throwTest = new ThrowTest(); try{ throwTest.judge(-100); } catch (RuntimeException e){ System.out.println(e.getMessage()); } }
如果把throw抛出的异常改为Exception,则直接报错,也就是不能编译。Exception包含两种异常:编译时异常和运行时异常,前者在编译前就要检查是否有可能产生编译时异常;后者是在编译后运行时才会判断的异常。而throw new Exception包含了编译时异常,需要显式处理掉这个异常,怎么处理?try-catch-finally或者throws
class ThrowTest{ private int Number; public void judge(int num) throws Exception{ if(num>=0){ this.Number = num; } else{ throw new Exception("传入参数为负数"); } } }
调用方也要随着进行更改。
@Test public void test2(){ ThrowTest throwTest = new ThrowTest(); try{ throwTest.judge(-100); } catch (RuntimeException e){ System.out.println(e.getMessage()); } catch (Exception e){ System.out.println(e.getMessage()); } }
——自定义异常类
throw还可以抛出自定义异常类。
自定义异常类的声明需要继承于现有的异常体系。
class MyException extends RuntimeException{ static final long serialVersionUID = -703489719076939L; //可以认为是一种标识 public MyException(){} public MyException(String message){ super(message); } }
此时我们可以抛出自定义的异常
class ThrowTest{ private int Number; public void judge(int num) throws MyException{ if(num>=0){ this.Number = num; } else{ throw new MyException("不能输入负数"); } } }
调用者修改
@Test public void test2(){ ThrowTest throwTest = new ThrowTest(); try{ throwTest.judge(-100); } catch (MyException e){ System.out.println(e.getMessage()); } }
以上がJava キーワード throw、throws、および Throwable の使用方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。