異常な
try{
……
} catch(ArrayIndexOutOfBoundsException e){
……
}
tryは可能な例外を置き、catchは可能な例外を処理します。
package hello;
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int idx = in.nextInt();
int[] a = new int[10];//下标最大为9
try {
a[idx] = 10;
System.out.println("Hello");
} catch(ArrayIndexOutOfBoundsException e) {
System.out.println("Catch");
}
}
}
/*1 Hello*/
/*10 Catch*/
例外をキャッチ
package hello;
import java.util.Scanner;
public class Main{
public static void f()
{
int[] a = new int[10];
a[10] = 10;
System.out.println("JHello");
}
public static void main(String[] args) {
try {
f();
} catch(ArrayIndexOutOfBoundsException e) {
System.out.println("catch");
}
System.out.println("main");
}
}
/*
catch
main
*/
package hello;
import java.util.Scanner;
public class Main{
public static void f()
{
int[] a = new int[10];
a[10] = 10;
System.out.println("JHello");
}
public static void k()
{
f();
}
public static void h()
{
int num = 10;
if(num < 100)
{
k();
}
}
public static void p()
{
try {
h();
} catch (NullPointerException e) {
System.out.println("p()");
}
}
public static void main(String[] args) {
try {
p();
} catch(ArrayIndexOutOfBoundsException e) {
System.out.println("catch");
}
System.out.println("main");
}
}
/*
catch
main
*/
例外をキャッチ
例外を取得した後:
- 文字列getMessage()
- 文字列tostring()
- void printStackTrace()
package hello;
import java.util.Scanner;
public class Main{
public static void f()
{
int[] a = new int[10];
a[10] = 10;
System.out.println("JHello");
}
public static void k()
{
f();
}
public static void h()
{
int num = 10;
if(num < 100)
{
k();
}
}
public static void p()
{
try {
h();
} catch (NullPointerException e) {
System.out.println("p()");
}
}
public static void main(String[] args) {
try {
p();
} catch(ArrayIndexOutOfBoundsException e) {
System.out.println("catch");
System.out.println(e.getMessage());
System.out.println(e);
e.printStackTrace();
}
System.out.println("main");
}
}
/*
catch
Index 10 out of bounds for length 10
java.lang.ArrayIndexOutOfBoundsException: Index 10 out of bounds for length 10
java.lang.ArrayIndexOutOfBoundsException: Index 10 out of bounds for length 10
at hello.Main.f(Main.java:9)
at hello.Main.k(Main.java:14)
at hello.Main.h(Main.java:21)
at hello.Main.p(Main.java:27)
at hello.Main.main(Main.java:34)
main
*/
もう一度投げる
package hello;
import java.util.Scanner;
public class Main{
public static void f()
{
int[] a = new int[10];
a[10] = 10;
System.out.println("JHello");
}
public static void k()
{
f();
}
public static void h()
{
int num = 10;
if(num < 100)
{
k();
}
}
public static void p()
{
try {
h();
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("p()");
}
}
public static void main(String[] args) {
try {
p();
} catch(ArrayIndexOutOfBoundsException e) {
System.out.println("catch");
}
System.out.println("main");
}
}
/*
p()
main
*/
package hello;
import java.util.Scanner;
public class Main{
public static void f()
{
int[] a = new int[10];
a[10] = 10;
System.out.println("JHello");
}
public static void k()
{
f();
}
public static void h()
{
int num = 10;
if(num < 100)
{
k();
}
}
public static void p()
{
try {
h();
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("p()");
throw e;
}
}
public static void main(String[] args) {
try {
p();
} catch(ArrayIndexOutOfBoundsException e) {
System.out.println("catch");
}
System.out.println("main");
}
}
/*
p()
catch
main
*/
例外メカニズム
例外メカニズムの最大の利点は、状況が発生したときに通常のビジネスロジックコードと処理コードを明確に分離することです。
例外のスローと宣言
例外宣言:関数が例外をスローする可能性がある場合は、関数ヘッダーで宣言する必要があります。
例外クラスはThrowableを継承します
- 新しいExceptin()をスローします
- 新しい例外をスローします(「ヘルプ」)
package hello;
import java.util.Scanner;
class openException extends Throwable{
}
class closeException extends Throwable{
}
public class Main{
public static int open()
{
return -1;
}
public static void readfile() throws openException, closeException
{
if(open() ==-1)
{
throw new openException();
}
}
public static void main(String[] args) {
try {
readfile();
} catch (openException e) {
// TODO Auto-generated catch block
System.out.println(e);
e.printStackTrace();
} catch (closeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
例外がキャッチされたときのマッチング
サブクラスによってスローされた例外は、親クラスの例外をキャッチするcatchによってキャッチされます。
package hello;
import java.util.Scanner;
class openException extends Exception{
}
class closeException extends openException{
}
public class Main{
public static int open()
{
return -1;
}
public static void readfile() throws openException, closeException
{
if(open() ==-1)
{
throw new closeException();
}
}
public static void main(String[] args) {
try {
readfile();
} catch (openException e) {
// TODO Auto-generated catch block
System.out.println(e);
e.printStackTrace();
}
}
}
/*
hello.closeException
hello.closeException
at hello.Main.readfile(Main.java:20)
at hello.Main.main(Main.java:25)
*/
すべての例外は、Throwableから継承するExceptionから継承します。
例外をキャッチします。
catch(Exception e){
……
}
package hello;
import java.util.Scanner;
class openException extends Exception{
}
class closeException extends openException{
}
public class Main{
public static int open()
{
int[] a = new int[10];
a[10] = 10;
return -1;
}
public static void readfile() throws openException, closeException
{
if(open() ==-1)
{
throw new closeException();
}
}
public static void main(String[] args) {
try {
readfile();
} catch (openException e) {
// TODO Auto-generated catch block
System.out.println(e);
e.printStackTrace();
} catch (Exception e)
{
e.printStackTrace();
}
}
}
/*
java.lang.ArrayIndexOutOfBoundsException: Index 10 out of bounds for length 10
at hello.Main.open(Main.java:16)
at hello.Main.readfile(Main.java:21)
at hello.Main.main(Main.java:28)
*/
ランタイム例外
- ArrayIndexOutOfBoundsExceptionなどの例外を宣言する必要はありません
- しかし、それをキャッチする適切なメカニズムがない場合、それは最終的にプログラムを終了させるでしょう
例外が継承に遭遇しました
- 関数が例外をスローする可能性がある場合は、関数ヘッダーで宣言する必要があります
- 例外をスローするように宣言された関数が呼び出される場合、次のことを行う必要があります。
-
- 関数呼び出しをtryブロックに入れ、catchを設定して、スロー可能なすべての例外をキャッチします
-
- または、未処理の例外をスローすることを宣言します
知らせ:
- 関数をオーバーライドする場合、サブクラスはスーパークラスバージョンよりも多くの例外をスローすることを宣言できません
- サブクラスのコンストラクターでは、スーパークラスによってスローされる可能性のあるすべての例外を宣言する必要があります
フロー
ストリームは入出力の方法です
ストリームは1次元です