プログラマーはバグの修正にほとんどの時間を費やしているため、コードを書くときに例外が発生するのは非常に一般的です。Java では、スロー可能オブジェクトの最上位クラスは 2 つに分けることができます。1 つは Error (エラー) で、もう 1 つはもう 1 つです。は例外(異常)です。
エラー (エラー): エラーと例外の違いは、エラーは処理できないことですが、プログラマによって引き起こされる問題です。たとえば、構文エラーがある場合、プログラマは結果エラー (StackOverflowError や OutOfMemoryError
) などの構文を自分でチェックし、その後プログラマ自身のロジックをチェックする必要があります。
Exception (例外): これは、後で説明する throws (例外の宣言)、try{}catch{} (例外の処理) など、いくつかの方法で処理できます。これらが例外の処理方法です。例外は、チェック例外 (コンパイル時例外) とチェックなし例外 (実行時例外) に分類されます。
コンパイル時例外: プログラムをコンパイルできません。これはコンパイル時例外です。例: クローンを作成する場合、例外は throws を通じて宣言する必要があります。
実行時例外:はコンパイルできるプログラムを指しますが、実行中に例外が発生しました。例: NullPointerException、
スローされる例外は ArrayIndexOutOfBoundsException または ArithmeticException です。
上記の例外は処理できますが、エラーが発生した場合はプログラマ自身がコードをチェックする必要があります。
これを処理するには 2 つの方法があります:
1 つは事前に防御型です:
boolean ret = false;
ret = ログイン ゲーム();
if (!ret) {
ログイン ゲーム エラーの処理;
return;
} r
et = マッチング開始();
if (!ret) {
マッチング エラーの処理;
return;
} r
et = ゲーム確認();
if (!ret) {
ゲーム確認エラーの処理;
return;
} r
et = ヒーロー選択();
if (!ret) {
ヒーロー選択エラーの処理;
return;
} r
et = ゲーム画面の読み込み中();
if (!ret) {
ゲーム読み込みエラーの処理;
return;
} .
....
事前の防御タイプは、すべてのステップでエラーがあるかどうかをチェックすることです。この欠点は、コードが非常にわかりにくく非効率に見えることです。
##1 つは、後で間違いを認めることです。試してみる {このアプローチは、考えられるすべての例外を try のコードに入れることです。例外が見つかった場合は、最初に操作を実行し、問題が発生した場合は対処してください。 コードを簡潔、明確、より効率的にするために、2 番目の trycatch をよく使用します。 例外のスローコードの一部が期待を満たさない場合は、Java の throw キーワードを使用して例外をスローする必要があります。 構文は throw newException (スローしたい例外)です。ゲームにログイン();
マッチング開始();
ゲーム確認();
ヒーローを選択();
ゲーム画面をロード();
...
} catch (ログイン ゲームの例外) {
ログイン ゲームの例外を処理します;
} catch (開始マッチングの例外) {
開始マッチングの例外を処理します;
} catch (ゲーム確認例外) {
ゲーム確認例外を処理します;
} catch (ヒーロー選択の例外) {
ヒーロー選択の例外を処理;
} catch (ゲーム画面の読み込み中の例外) {
ゲーム画面例外のロードを処理します;
} .
....
public class TestDemo { public static void func(int a) { if(a==10) { throw new RuntimeException("a==10不符合预期,抛出这个异常"); } } public static void main(String[] args) { func(10); } }このコードを見てください: たとえば、数値 10 はプログラムの期待を満たしていないため、スローするには例外、私 次のように実行できます: throw new RuntimeException("a==10 が期待を満たしていないため、この例外をスローします");例外の処理通常、2 つの方法があります。例外を処理するには、1 つは throw を通じて例外を宣言すること、もう 1 つは try{}catch{} を通じてコード ブロックに例外があるかどうかを確認することです。例外がある場合は、catch がそれをキャッチします。例外がない場合は、の場合、次のコードは正常になります。 throws は例外を宣言します構文: throws 例外、例外、例外...(複数の例外を宣言できます)
public class TestDemo { public static void function(int[] array) { System.out.println(array[100]); } public static void main(String[] args) { int[] array = {7, 8, 9, 5, 6}; function(array); } }ここに 100 回の訪問があることは誰もが知っています。マークは配列の範囲外の例外です: 次に、 throws を通じて例外を宣言します: エラーは引き続き報告されます。 main 関数への例外も宣言した場合: 答えは依然としてエラーになります。 したがって、ここから結論を導き出します: Throws は、この例外がこのメソッドで発生する可能性があることをコンパイラに伝えるだけであり、単なるステートメントですが、例外は処理されません。また、あるメソッドで例外が発生した場合、そのメソッドが例外を処理するかどうかを確認し、例外を処理しない場合は、上位の呼び出し元が例外を処理するかどうかを確認します。ここで、 func は例外を宣言するだけで例外の処理は行わず、上位の呼び出し元 (つまり main メソッド) が例外を処理するか処理しないかをチェックし、最後に JVM に引き渡されます。プログラムを処理して終了します。例外宣言は、Exception クラスまたはそのサブクラスである必要があります。
要处理异常,就需要使用接下来所述的try{}catch语句。
try{
}catch(){
}
在Java我们利用try{}catch{}来处理异常;
语法:
try{ //可能发生异常的代码 }catch(异常 变量){//例如:ArrayIndexOutOfBoundsException(要捕获的异常) e(变量) //如果try中的代码抛出异常了,此处catch捕获时异常类型与try中抛出的异常类型一致时, //或者是try中抛出异常的基类时,就会被捕获到 // 对异常就可以正常处理,处理完成后,跳出try-catch结构,继续执行后序代码 }finally{ //此处代码一定会执行,用于资源清理扫尾等工作 }
我们先来讲一下try{}catch(){}
/*在方法中处理异常*/ public class TestDemo { public static void function(int[] array) throws ArrayIndexOutOfBoundsException { try{ System.out.println(array[100]); }catch(ArrayIndexOutOfBoundsException e) { System.out.println("array[100]->数组下标越界异常catch->捕获成功"); } } public static void main(String[] args) throws ArrayIndexOutOfBoundsException { int[] array = {7, 8, 9, 5, 6}; function(array); } } /*在main方法中处理异常*/ public class TestDemo { public static void function(int[] array) throws ArrayIndexOutOfBoundsException { System.out.println(array[100]); } public static void main(String[] args) throws ArrayIndexOutOfBoundsException { int[] array = {7, 8, 9, 5, 6}; try{ function(array); }catch(ArrayIndexOutOfBoundsException e) { System.out.println("array[100]->数组下标越界异常catch->捕获成功"); } } }
我们使用try{}catch(){}就可以对异常进行处理,既可以在方法中处理异常也可以在main方法中处理异常,同时这里throws虽然没有什么用处,但是可以清晰的告诉程序员,这个方法未来可能会发生这个异常,所以还是有必要的。
try{}catch{}注意点 一:
当捕获异常成功的时候,后面的业务代码正常执行,如果没有捕获那就不会执行。
try{}catch{}注意点 二:
当try里检查到异常,catch就会捕获,计算这个异常后面还有异常也不会执行。
try{}catch{}注意点三:
throws只是声明异常,并没有处理异常,我们要通过try{}catch(){}来处理异常。
try{}catch{}注意点四:
当catch捕获的异常类型与发生异常类型不符合,就不会被捕获,就继续往外抛异常知道JVM收到后终止程序
try{}catch{}注意点五:
当发生多种异常的时候,那就要多种catch来捕获,多种异常,多次捕获。
try{}catch{}注意点六:
Exception是所有类的父类不能在前面捕获,而是应该放在最末尾进行收尾工作。
既然Exception类是所对应异常类的父类,那可不可以捕获Exception,即多次异常,一次捕获呢??
catch 进行类型匹配的时候, 不光会匹配相同类型的异常对象, 也会捕捉目标异常类型的子类对象
答案是不建议的。当代码变得复杂时,只捕获Exception类并不能明确哪些处理方式出现了问题。
打印异常信息
我们还可以利用printStackTrace来打印错误信息。
finally经常与try{}catch(){}进行一起使用,finally主要是进行资源的清理,的扫尾工作,且finally一定会被执行。
我们来看这样一段代码结果会是什么??
public class TestDemo { public static int function(int[] array) throws ArrayIndexOutOfBoundsException { try { System.out.println(array[100]); }catch(ArrayIndexOutOfBoundsException e) { System.out.println("array[100]->数组下标越界异常catch->捕获成功"); return -1; }finally{ System.out.println("finally主要进行资源回收和清理的扫尾工作~~~"); return 9; } } public static void main(String[] args) throws ArrayIndexOutOfBoundsException,ArithmeticException { int[] array = {7, 8, 9, 5, 6}; System.out.println(function(array)); System.out.println("以下是业务代码~~~~~~"); } }
答案并不是我们想的return-1,执行结束,而是return9,我们这里可以理解为finally的9将catch里的-1覆盖。所以finally里面的代码是一定会执行的。
我的理解:
第一步检查try里面的代码里是否有异常,如果有异常catch就进行捕获,如果没有异常接着往下执行,这里catch如果没有捕获到就看一看上层调用者有没有处理,有处理就进行处理,没有处理就交给JVM终止程序。如果catch捕获到了,下面正常的业务代码正常执行。无论catch是否捕获到异常,finally代码块都将被执行。
官方:
程序先执行 try 中的代码
如果 try 中的代码出现异常, 就会结束 try 中的代码, 看和 catch 中的异常类型是否匹配.
如果找到匹配的异常类型, 就会执行 catch 中的代码
如果没有找到匹配的异常类型, 就会将异常向上传递到上层调用者.
无论是否找到匹配的异常类型, finally 中的代码都会被执行到(在该方法结束之前执行).
如果上层调用者也没有处理的了异常, 就继续向上传递.
一直到 main 方法也没有合适的代码处理异常, 就会交给 JVM 来进行处理, 此时程序就会异常终止。
在我们做很大型的项目的时候,我们就会发现,我们遇到的异常,在Java中的内置异常并没有,所以我们就需要自己定义一个异常,来维护我们实际中遇到的异常。
java 中虽然已经内置了丰富的异常类, 但是并不能完全表示实际开发中所遇到的一些异常,此时需要维护符合我们实际情况的异常结构
在Java中自己声明异常,不是说你写了个异常的名字就是一个异常,而是在你自己定义的异常需要取继承原有的内置异常。
我们通过一个登陆的代码来讲解自定义异常:
class LogIn { private String name ="Admin";//用户名 private String password= "CsDn1263987..0"; public void logInFor(String name,String password) throws UserNameErrorExecption, PasswordErrorException { if(!this.name.equals(name)){ throw new UserNameErrorExecption("用户名参数异常!!!"); } if(!this.password.equals(password)) { throw new PasswordErrorException("用户密码参数异常!!!"); } System.out.println("~~~登陆成功~~~"); } } public class TestDemo{ public static void main(String[] args) throws UserNameErrorExecption, PasswordErrorException { LogIn logIn = new LogIn(); //logIn.logInFor("Admin","CsDn1263987..0"); try{ logIn.logInFor("Admin","CsDn126398..0"); }catch(UserNameErrorExecption nameError) { nameError.printStackTrace(); System.out.println("用户名错误!!!"); }catch(PasswordErrorException passwordError) { passwordError.printStackTrace(); System.out.println("密码错误!!!"); } } }
自定义异常:
class PasswordError extends Exception { public PasswordError(String message) { super(message); } }
class UserNameError extends Exception { public UserNameError(String message) { super(message); } }
这就是我们定义的两个异常。
通过继承Exception来定义两个异常。
通常我们自定义异常类要继承Exception或者RunTimeException类,除此之外也可以定义其他类作为异常类。
自定义异常通常会继承自 Exception 或者 RuntimeException
继承自 Exception 的异常默认是受查异常
继承自 RuntimeException 的异常默认是非受查异常
以上がJava例外を処理するにはどのような方法がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。