1.異常は何ですか?
例外はプログラムの一部のエラーですが、すべてのエラーが異常なわけではなく、エラーを回避できる場合もあります。
たとえば、コードにセミコロンがない場合、結果はエラーjava.lang.Errorになります。
System.out.println(11/0)を使用すると、0で除算しているため、java.lang.ArithmeticExceptionがスローされます。
- ユーザーが不正なデータを入力しました。
- 開くファイルが存在しません。
- ネットワーク通信中に接続が中断されたか、JVMメモリーがオーバーフローしました。
- チェック可能な異常:最も代表的なチェック可能な異常は、ユーザーのエラーや問題が原因で発生し、プログラマーが予測できないものです。たとえば、存在しないファイルを開こうとすると、例外が発生しますが、これらの例外はコンパイル時には無視できません。
- 実行時例外: 実行時例外は、プログラマーが回避できる例外です。チェック例外とは対照的に、ランタイム例外はコンパイル時に無視できます。
- エラー: エラーは例外ではありませんが、プログラマーが制御できない問題です。エラーは通常、コードでは無視されます。たとえば、スタックがオーバーフローするとエラーが発生し、コンパイル中にエラーが検出されません。
2.共通の例外クラス階層
入出力例外:IOException
算術例外クラス:ArithmeticExecption
Nullポインタ例外クラス:NullPointerException
型キャスト例外:ClassCastException
操作データベース例外:SQLException
ファイルが見つかりません例外:FileNotFoundException
配列の負の添え字例外:NegativeArrayException
配列インデックスの範囲外例外:ArrayIndexOutOfBoundsException
セキュリティ原則の異常違反:SecturityException
ファイルが異常終了しました:EOFException
例外を番号付けする文字列:NumberFormatException
メソッドが見つかりません例外:NoSuchMethodException
3.例外処理
3.1 try and catchによる例外のキャッチ
try
{
可能性のある例外
} catch(例外タイプの例外名(変数)){
例外処理のコード
} catch(例外タイプの例外名(変数)){
例外処理のコード
} ...
[最終的に{
リソースコードを解放する;
}]
パッケージ例外。 import java.io.IOException; / ** * * @ClassName:TestException * @Description:TODO * @Auther:chujiu * @Date:2020/4/13 7:15 * @version :V1.0 * / public class TestException { public int method(){ { int i = 5/0 ;を試してください。 // 算术异常 System.out.println( "無异常" ); 1を返す; } catch (例外e){ System.out.println( "有异常" e.printStackTrace();); 2を返します。 } 最後に{ System.out.println( "执行fianlly" ); リターン 3 ; } } public static void main(String [] args){ TestException te = new TestException(); System.out.println(te.method()); } }
- catchはtryと独立して存在することはできません。
- try / catchの後にfinallyブロックを追加することは必須ではありません。
- tryコードの後は、catchブロックも最終ブロックもありません。
- try、catch、finallyブロックの間にコードを追加することはできません。
- まず、事実を理解するのは容易ではありません。tryブロックにreturn、break、continue、および実行フローを変更する他のステートメントがあったとしても、最終的に実行されます。
- 最終的にreturnは、tryまたはcatchの戻り値を上書きします。
- 最終的にreturnまたはexceptionは、前のtryまたはcatchブロックの例外を抑制(排除)します。
3.2 throwキーワードが例外をスローする
メソッドで例外オブジェクトを人為的にスローすることを指します(この例外オブジェクトは、それ自体でインスタンス化されるか、既存のものをスローする場合があります)。例外をスローするために使用されます。
3.3スローによる例外のスロー
メソッドがスローする可能性のある例外を宣言するためにメソッドシグネチャで使用されます。mainメソッドは、throwsを使用してスローすることもできます。スローがメインメソッドで使用されている場合、メインメソッドで必須の例外処理がないことを意味します。例外が発生すると、デフォルトの処理のために例外がJVMに渡され、プログラムが実行を中断します。
パッケージ例外。 import java.io.IOException; / ** * * @ClassName:TestException1 * @Description:TODO * @Auther:chujiu * @Date:2020/4/13 7:17 * @version :V1.0 * / public class TestException1 { public static void method2()スローにIOException { intが I = 0 。 if(i == 0 ){ 新しい IOException( "除以0错误"をスローする ); } int x = 5 / i; System.out.println( "ワイヤレス异常" ); } public static void method1(){ try { method2(); } catch (IOException e){ e.printStackTrace(); System.out.println( "有异常" ); } 最後に{ System.out.println( "执行fianlly" ); } } public static void main(String [] args){ method1(); } }
4.カスタム例外
カスタム例外には、常に次のコンストラクターが含まれている必要があります。
パラメーターなしのコンストラクター
とStringパラメーターを持つコンストラクターで、親クラスのコンストラクターに渡されます。
StringパラメータとThrowableパラメータが親クラスのコンストラクタに渡され、Throwableパラメータを持つコンストラクタ
が親クラスのコンストラクタに渡されます。
IOExceptionクラスの完全なソースコード:
パッケージjava.io; public class IOException extends Exception { static final long serialVersionUID = 7818375828146090155L ; public IOException(){ super (); } public IOException(String message){ super (message); } public IOException(String message、Throwable cause){ super (message、cause); } public IOException(Throwable cause){ super (cause); } }
パッケージ例外; インポートjava.util.Scanner; / ** * * @ClassName:DemoRegisterException * @Description:TODO * @Auther:chujiu * @Date:2020/4/13 7:17 * @version :V1.0 * / public class DemoRegisterException { // 1.配列を使用して、登録されたユーザー名(データベース)を保存します static String [] usernames = {"张三"、 "李四"、 "王五" }; public static void main(String [ ] args)/ * RegisterExceptionをスローします* / { // 2. Scannerを使用して、ユーザーが入力した登録済みユーザー名(フロントエンド、ページ)を取得し ますsc =new Scanner(System.in); System.out.println( "登録するユーザー名を入力してください:" ); 文字列username = sc.next(); checkUsername(username); } // 3.メソッドを定義し、ユーザーが入力した登録済みユーザー名を判断します public static void checkUsername(String username)/ * throws RegisterException * / { // 登録済みユーザー名を格納する配列を走査し 、(String name:usernames)の各ユーザー名を取得します{ // 取得したユーザー名を使用して、ユーザーが入力したユーザー名と比較します if (name.equals(username)){ // true:ユーザー名がすでに存在し、RegisterException例外をスローしてユーザーに通知します "プロ、ユーザー名が登録されました"; 試す{ スロー 新しい新 RegisterException(「プロ、ユーザ名がすでに登録されている」); } キャッチ(RegisterException E){ e.printStackTrace(); リターン ; // 終了方法 } } } // サイクルの終わりには、繰り返し発見されていない場合ユーザー名、ユーザープロンプト、 "おめでとう、登録が成功した!"; System.out.printlnは( "正常に登録おめでとう!" ); } } // 例外クラスの クラス RegisterException 拡張 / * 例外* / のRuntimeException { // 追加空のパラメーターコンストラクター publicRegisterException(){ super (); } / * 例外情報を含むコンストラクターを追加し ます。 ソースコードを確認し、すべての例外クラスに例外情報を含むコンストラクターがあることを確認します。親メソッドが例外情報を含むコンストラクターを呼び出します。親クラスにこの例外メッセージを処理させる* / public RegisterException(String message){ super (message); } }