12_Java_Exceptionの処理と入出力

異常な

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次元です

おすすめ

転載: blog.csdn.net/qq_45459526/article/details/122936446