10.例外および例外クラス
7121 ワード
この文章は私が勉強したものを整理したものです。
10.1異常と異常類
エラー:ハードウェア障害
例外:ユーザーのエラー操作、開発者のエラー符号化。
例外タイプ
-通常異常、運転異常
✔一般異常
✔運転異常
コンパイル
10.2運転異常
10.2.1 NullPointerException
10.2.2 ArrayIndexOutOfBoundException
10.2.3 NuberFormatException
10.2.4 ClassCastException
10.3異常処理コード
✨일반 예외처리
public class TryCatchFinallyExample {
public static void main(String[] args) {
try {
Class Class = Class.forName("java.lang.String2");
} catch (ClassNotFoundException e) {
System.out.println("클래스가 존재하지 않습니다.");
e.printStackTrace();
}
}
}
✨실행예외처리 - 오로지 개발자의 경험에 의해 작성해주어야 한다.
public class TryCatchFinallyRuntimeExceptionExample {
public static void main(String[] args) {
String data1 = null;
String data2 = null;
try {
data1 = args[0];
data2 = args[1];
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("실행 매개값의 수가 부족하다.");
System.out.println("[실행 방법]");
return;
}
try {
int value1 = Integer.parseInt(data1);
int value2 = Integer.parseInt(data2);
int result = value1 + value2;
} catch (NumberFormatException e) {
System.out.println("숫자로 변환 할 수 없습니다.");
} finally {
System.out.println("다시 실행 하세요.");
}
}
}
10.4異常タイプの処理コード
10.4.1多catch
public class CatchByExeptionKindExample {
public static void main(String[] args) {
try {
String data1 = args[0];
String data2 = args[1];
int value1 = Integer.parseInt(data1);// 여기는 실행이 안된다.
int value2 = Integer.parseInt(data2);
int result = value1 + value2;
System.out.println(data1 + "+" + data2 + "=" + result);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("실행 매개값의 수가 부족하다.");
System.out.println("[실행 방법]");
} catch (NumberFormatException e) {
System.out.println("숫자로 변환 할 수 없습니다.");
} finally {
System.out.println("다시 실행 하세요.");
}
}
}
catchブロックが複数あっても、1つだけ実行されます。tryブロックに複数の例外が同時に発生しないため、1つの例外が発生すると、直ちに実行を停止し、対応するcatchブロックに移動します。
10.4.2 catch順序
複数のcatchブロックを作成する際に注意したいのは、親例外クラスがサブ例外クラスの下にある必要があることです。子例外は親例外を継承するため、親例外タイプにも属します。
10.4.3マルチキャプチャ
public class MultiCatchExample {
public static void main(String[] args) {
try {
String data1 = args[0];
String data2 = args[1];
int value1 = Integer.parseInt(data1);
int value2 = Integer.parseInt(data2);
int result = value1 + value2;
System.out.println(data1 + "+" + data2 + "=" + result);
} catch (ArrayIndexOutOfBoundsException | NumberFormatException e) {
System.out.println("실행 매개값의 수가 부족하거나 숫자로 변환할 수 없습니다.");
} catch (Exception e) {
System.out.println("알수 없는 예외.");
} finally {
System.out.println("다시 실행 하세요.");
}
}
}
10.5リソースの自動クローズ
Java 7に新しく追加されたtry-with-resourcesを使用すると、リソースオブジェクト(各種I/Oストリーム、サーバソケット、ソケット、および各種チャネル)のclose()メソッドを呼び出し、リソースを安全に閉じることができます。
リソースを単純なデータ読み書きオブジェクトと見なします。
FileInputStream fis = null;
try {
fis = new FileInputStream("file.txt");
} catch (FileNotFoundException e) {
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
}
}
}
//✨자바 7에서 새로 추가됬다.
try (FileInputStream fis = new FileInputStream("file.txt")) {
} catch (IOException e) {
}
//✨try 블록이 정상적으로 실행을 완료했거나 예외가 발생하게 되면 자동으로
FileInputStream의 close() 메소드가 호출된다.
//✨복수개의 리소스를 작성할 수 도 있다.
try (FileInputStream fis1 = new FileInputStream("file.txt");
FileInputStream fis2 = new FileInputStream("file.txt")) {
} catch (IOException e) {
}
//✨try - with - resources를 사용하기 위해서는 조건이 있는데
리소스 객체는 java.lang.AutoCloseable 인터페이스를 구현하고 있어야 한다.
public class FileInputStream implements AutoCloseable {
private String file;
public FileInputStream(String file) {
this.file = file;
}
public void read() {
System.out.println(file + "를 읽습니다.");
}
@Override
public void close() throws Exception {
System.out.println(file + "를 닫습니다.");
}
}
public class TryWithResourceExample {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("file.txt")) {
fis.read();
throw new Exception();// 강제로 예외 발생
} catch (Exception e) {
System.out.println("예외처리 코드가 실행되었습니다.");
}
}
}
10.6転移異常
メソッド内部で異常が発生する可能性のあるコードをtry-catch構文として異常を処理することは基本的であるが,異常を呼び出しメソッドの場所に移すこともできる.このとき使うキーワードはthrowsです。
public void method1() {
try {
method2();
} catch (ClassNotFoundException e) {
System.out.println("클래스가 존재하지 않습니다.");
}
}
public void method2() throws ClassNotFoundException{
Class class = Class.forName("java.lang.String2");
}
10.7カスタム異常と異常発生
Javaが提供するクラスのみを使用して、さまざまな例外を表すことはできません。たとえば、銀行業務を処理するプログラムで、残高よりも多くの引き出し要求が受信されると、エラーが発生し、残高不足のエラーが発生する必要がありますが、残高不足のAPIはJavaには存在しません。この場合、開発者は自分で定義して作成する必要があるため、カスタム例外と呼ばれます。
10.7.1ユーザー定義の例外クラス宣言
public class BalanceInsufficientException extends Exception {
//사용자 정의 예외 클래스 이름은 Exception으로 끝나는 것이 좋다.
//사용자 정의 예외 클래스도 필드, 생성자, 메소드 선언들을 포함할 수 있지만,
//대부분 생성자 선언만을 포함한다.
//생성자는 두개가 일반적인데,하나는 기본생성자
//다른 하나는 예외 발생 원인을 전달하기 위해 Stirng 타입의 매개 변수를 갖는 생성자이다.
//String 타입의 매개변수를 갖는 생성자는 상위 클래스의 생성자를
//호출하여 예외 메시지를 넘겨준다.
public BalanceInsufficientException() {
}
public BalanceInsufficientException(String message) {
super(message);
}
}
public class Account {
private long balance;
public Account() {
}
public long getBalance() {
return balance;
}
public void deposit(int money) {
balance += money;
}
public void withdraw(int money) throws BalanceInsufficientException {
if (money > balance) {
throw new BalanceInsufficientException("잔고 부족: " + (money - balance) + "이 모자람.");
}
balance -= money;
}
}
public class AccountExample {
public static void main(String[] args) {
Account acc = new Account();
acc.deposit(10000);
System.out.println("예금액:" + acc.getBalance());
try {
acc.withdraw(30000);
} catch (BalanceInsufficientException e) {
System.out.println("meassage:" + e.getMessage());
System.out.println();
e.printStackTrace();
}
}
}
Reference
この問題について(10.例外および例外クラス), 我々は、より多くの情報をここで見つけました https://velog.io/@chaean_7714/10.예외와-예외-클래스テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol