異常な
異常なレベル
- エラー:Javaランタイムエラーやシステムの内部資源枯渇エラー。アプリケーションは、オブジェクトのこのタイプを投げるべきではありません。加えて、このような内部エラーが、ユーザーへの通知、およびプログラムが安全に外に終了させるためにしようとする場合は、彼がこれ以上やることができませんでした。
- 例外
- RuntimeException:プログラムによって引き起こされる例外エラー
- その他の異常:プログラム自体は問題ありませんが、同様の例外IOエラー
チェック異常異常&ランタイム
異常な例はのRuntimeExceptionクラスとそのサブクラスではありません。チェック例外
ランタイム例外:すべてのクラスとのRuntimeExceptionのサブクラスの例外インスタンス
Javaはチェック例外が修理例外が処理されて考えることができるので、プログラムがチェック例外を処理しない場合、プログラムはエラーコンパイル時でしょう、処理チェック例外を表示する必要があります。異常チェックJavaの設計思想を反映し、完璧なエラー処理コードが実行されることはありませんがありません。
例外処理のチェック方法:
現在の方法は明らかにあなたはのtry-catchが例外を扱う使用する必要があり、例外を処理する方法を知っています
現在のメソッドが例外を処理する方法を知らない、メソッドを定義するときにスローされるべき声明
途中で取り扱うランタイム例外:
- 実行時例外は、プログラムが実行時例外をキャプチャする必要がある場合は、try-catchブロックを使用することができる、明示的に宣言せずにスローされます
文の例外がスローされるスロー
現在のメソッドは、呼び出し側が渡し、その後の契約、およびは、JVMプロセスまでスローする方法を知っていない場合は、より高いレベルの発信者と対処すべき例外のこのタイプを処理する方法を知らない場合。
スロースロー文が唯一のメソッド宣言で使用することができ、あなたはスロー複数の例外クラスを宣言することができます。スローされます使用してのtry-catchを使用して例外をキャッチする必要はありませんプログラムを宣言する声明をスローします。
例:次のプログラム文は、IOExceptionが処理されませんが、異常はJVMプロセスを呼び
import java.io.FileInputStream;
import java.io.IOException;
public class ThrowsTest {
public void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("a.txt");
}
}
如果某段代码中调用了一个带 throws 声明的方法,该方法声明抛出了 Checked 异常,则表明该方法希望它的调用者来处理该异常。那么调用者在调用该方法时,要么将其放入 try 块中并显示捕获该异常,要么放在另一个带 throws 声明抛出的方法中。
示例代码如下:
import java.io.FileInputStream;
import java.io.IOException;
public class ThrowsTest2 {
public static void test() throws IOException {
/* 因为 FileInputStream 的构造器声明抛出 IOException 异常
所以调用 test() 方法 的代码要么处于 try-catch 块中
要么处于另一个带 throws 声明抛出的方法中
*/
FileInputStream fis = new FileInputStream("a.txt");
}
public static void main(String[] args) throws Exception {
/* 因为 test() 方法声明抛出 IOException 异常
所以调用该方法的代码要么处于 try-catch 块中
要么处于另一个带 throws 声明抛出的方法中
*/
test();
}
}
主动抛出异常 throw
如果 throw 语句抛出的异常是 Checked 异常,则该 throw 语句要么处于 try 块里,显式捕获该异常,要么放在一个带 throws 声明抛出的方法中;如果 throw 语句抛出的是 Runtime 异常,则无需放在 try 块里,也无需放在带 throws 声明抛出的方法中,既可以显式的用 try-catch 来捕获并处理异常,也可以完全不理会该异常,把该异常交给该方法调用者处理。
import java.io.IOException;
public class ThrowTest3 {
public static void throwChecked(int a) throws Exception {
if (a > 0) {
// 自行抛出 Exception 异常
// 该代码必须处于 try 块里,或处于带 throws 声明的方法中
throw new Exception("a的值大于0,不符合要求");
}
}
public static void throwRuntime(int a) {
if (a > 0) {
// 自行抛出 RuntimeException 异常
// 既可以捕获该异常,也可以完全不理会该异常,把异常交给方法调用者处理
throw new RuntimeException("a的值大于0,不符合要求");
}
}
public static void main(String[] args) {
try {
// 调用声明抛出 Checked 异常的方法,要么显式在 try-catch 中捕获该异常,要么在 main 方法中再次声明抛出
throwChecked(3);
} catch (Exception e) {
System.out.print(e.getMessage());
}
// 调用声明抛出 Runtime 异常的方法既可以显式捕获该异常,也可以不理会该异常
throwRuntime(3);
}
}
自定义异常类
public class AuctionException extends Exception {
// 无参构造器
public AuctionException() {}
// 带一个字符串参数的构造器
public AuctionException(String msg) {
super(msg);
}
}
异常链
将原始信息隐藏起来,仅向上提供必要的异常提示信息的处理方式,可以保证底层异常不会扩散到表现层,避免向上暴露太多的细节,符合面向对象的封装原则。
public calSal() throws SalException {
try {
// 实现结算工资的业务逻辑
...
} catch (SQLException sqle) {
// 将原始异常记录下来,留给管理员
...
// 下面异常中的 message 就是给用户的提示
throw new SalException("访问数据库异常“);
} catch (Exception e) {
// 将原始异常记录下来,留给管理员
...
// 下面异常中的 message 就是给用户的提示
throw new SalException("系统出现未知异常“);
}
}
欢迎关注我的公众号