プログラミングが好きなあなたのように!
SpringBoot実用的なコースは学習https://edu.csdn.net/course/detail/31433
SpringCloud入門コースを学びhttps://edu.csdn.net/course/detail/31451を
序文
この記事では、Javaの例外処理メカニズムを理解しましょう。
何が異常なのか
プログラムの実行中に発生するエラー、例外が発生すると、それを処理する必要があります。プログラムが処理されない場合、実行は中断されます。
例外アーキテクチャ
Throwableは、JVMによって生成およびスローできる、例外およびエラーの親クラスです。
Throwableのサブクラス:
- 例外
例外が発生した後、プログラムを処理することができ、処理後にプログラムを正常に実行することができます。 - エラーエラー
は通常、StackOverflowスタックオーバーフローやOutOfMemoryErrorメモリオーバーフローなどのシステムレベルのエラーです。エラーが発生した後は処理できず、コードを変更して回避することしかできません。
異常な分類
- 未チェックの例外
RuntimeExceptionとそのサブクラス、プログラムは処理を必要としません - チェックされた例外チェックされた例外は
RuntimeExceptionではなく、プログラムは処理を必要とします
一般的な例外
クラス名 | 異常な |
---|---|
NullPointerException | ヌルポインタ例外 |
ClassCastException | 型変換例外 |
ArrayIndexOutOfBoundsException | 配列添え字の範囲外例外 |
StringIndexOutOfBoundsException | 文字列添え字の範囲外例外 |
NumberFormatException | 数値形式が異常 |
InputMismatchException | 入力フォーマットが異常です |
IllegalArgumentException | 間違ったパラメータ例外 |
ArithmeticException | 算術例外 |
ParseException | 日付解析の例外 |
SQLException | データベース例外 |
IOException | 入出力異常 |
ClassNotFoundException | クラスが見つからない例外 |
try-catch例外処理
例外が処理された後、プログラムは正常に実行できます。
構文:
try{
可能出现异常的代码
}catch(异常类型 ex){
处理异常的代码
}
例外処理プロセス:
- tryのコードに例外がある場合、JVMは自動的に例外をスローし、プログラムはキャッチにジャンプして例外処理を実行し、プログラムは処理の終了後に正常に実行されます。
- トライコードに例外がない場合は、トライコードを実行し、キャッチをスキップして次のコードを実行します。
例外の一般的な方法
例外方法:
メソッド名 | 効果 |
---|---|
void printStackTrace() | スタック情報を印刷する |
文字列getMessage() | 例外情報を取得する |
スロー可能なgetCause() | 上位レベルの例外を取得する |
マルチキャッチ例外処理
文法:
try{
可能出现异常的代码
}catch(异常类型1 ex){
处理代码1;
}catch(异常类型2 ex){
处理代码2;
}...
例外処理プロセス:
- 例外が発生したら、例外を各catchブロックと照合します。照合が成功した場合は、catchを実行して終了します。
- 一致しない場合は、次のキャッチの例外タイプを判別します。
注:キャッチに他の異常な親クラスがある場合は、親クラスの例外を最後に配置する必要があります
try-catch-finally例外処理
最後に、finallyのコードはとにかく実行されます
。プログラムには、データベース接続の閉鎖、ファイルストリームの閉鎖、ネットワーク接続の閉鎖など、実行する必要のあるコードがいくつかあります。
try{
可能出现异常的代码
}catch(异常类型 ex){
异常处理
}finally{
如论如何都执行的代码
}
例外処理プロセス:
- tryに例外がある場合は、catchにジャンプして処理を実行し、最後にfinallyコードを実行します。
- tryに例外がない場合、tryが実行され、finallyがfinallyに実行されます。
try-catch-finallyケース
Scanner input = new Scanner(System.in);
try{
System.out.println("输入一个数:");
int num1 = input.nextInt();
System.out.println("输入一个数:");
int num2 = input.nextInt();
int result = num1 / num2;
System.out.println("result = " + result);
}catch(ArithmeticException ex){
System.out.println("出现了算术异常");
ex.printStackTrace();
}catch(InputMismatchException ex){
System.out.println("出现了输入格式异常");
ex.printStackTrace();
}catch(Exception ex){
ex.printStackTrace();
}finally{
System.out.println("最终执行的代码");
}
System.out.println("程序执行完毕~~~");
キーワードを投げて投げる
throwsキーワードは
、メソッドで例外を宣言するために使用されます。メソッドが例外を宣言すると、メソッドは例外を処理する必要がなく、メソッドの呼び出し元がそれを処理します。
通常、実行時以外の例外に使用されます。
文法:
public 返回值类型 方法名(参数列表) throws 异常类型1, 异常类型2...{
}
throwキーワードは
、手動で例外をスローし、呼び出し元にプロンプトを表示するために使用されます。
構文:
if(条件){
throw new 异常类型("异常描述信息");
}
演習:人の年齢を入力します。年齢は0〜100でなければなりません。年齢を超えると、IllegalArgumentExceptionがスローされます。
/**
* 输入年龄
* @throws IllegalArgumentException
*/
static void inputAge() throws IllegalArgumentException{
Scanner input = new Scanner(System.in);
System.out.println("输入年龄(0~100)");
int age = input.nextInt();
//手动抛出异常
if(age < 0 || age > 100){
throw new IllegalArgumentException("年龄必须在0到100之间");
}
System.out.println("年龄是"+age);
}
public static void main(String[] args) {
try{
inputAge();
}catch(IllegalArgumentException ex){
ex.printStackTrace();
}
}
カスタム例外
特定のビジネス要件の下では、システム内の例外を適切に処理できないか、ビジネス上の問題を表します。例外クラスをカスタマイズして、特定のビジネス上の問題を解決できます。
たとえば、銀行口座からお金を引き出すときは、残高が十分かどうかを判断する必要があり
ます。実装手順:
1)Exceptionまたはそのサブクラスを継承するクラスを定義します
。2)特定の条件が満たされた場合は、メソッドでthrowを使用します。例外をスローする。
メソッドを宣言する場合3)を、使用することは、文の例外スロー
メソッドを呼び出すとき4)、使用のtry-catchが例外を処理するために
/**
* 余额不足异常
* @author xray
*
*/
public class BalanceException extends Exception{
public BalanceException(String msg){
//将异常描述信息传给父类
super(msg);
}
}
/**
* 银行账户类
* @author xray
*
*/
public class BankAccount {
private String name;
private int balance;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getBalance() {
return balance;
}
public void setBalance(int balance) {
this.balance = balance;
}
public BankAccount(String name, int balance) {
super();
this.name = name;
this.balance = balance;
}
public BankAccount() {
super();
}
/**
* 存钱
* @param money
*/
public void saveMoney(int money){
this.balance += money;
System.out.println("账户"+name+"的余额是"+balance);
}
/**
* 取钱
* @param money
* @throws BalanceException
*/
public void takeMoney(int money) throws BalanceException{
//如果余额不足,就抛出自定义异常
if(balance < money){
throw new BalanceException("对不起,您账户余额不足");
}
this.balance -= money;
System.out.println("账户"+name+"的余额是"+balance);
}
}
public class TestBank {
@Test
public void testBankAccount(){
//创建银行账户
BankAccount account = new BankAccount("恒哥",10000);
account.saveMoney(1000);
//处理异常
try {
account.takeMoney(10000);
} catch (BalanceException e) {
e.printStackTrace();
}
}
}
終わり
割り当て:
学生クラスの定義、名前、年齢、性別属性、学習メソッドの
定義メソッドの定義、メソッドに名前、年齢、性別を
入力して、学生オブジェクトの性別入力エラーを作成します。RuntimeExceptionがスローされ、情報が含まれます。男性または女性
年齢が正しく入力されていない場合、RuntimeExceptionがスローされ、情報が含まれます。年齢は18〜30歳である必要があります。メソッドで
RuntimeExceptionを宣言するには、throwsを使用し
ます。メソッドを呼び出すときは、try-catchを使用して例外を処理します。
他のJavaの知識を学ぶ必要がある場合は、ここでJavaの概要に関する非常に詳細な知識を調べてください。