/ *
- 例外処理1つのtry-catch-最後に
- 1、Javaの例外処理メカニズムを使用して、別々に通常のコードから、一緒にプログラムコードを例外処理であります
- プログラムの過度のif-else分岐コードが長く、肥大化し、貧しい可読性につながります。したがって、例外処理メカニズムを使用して。これは、プログラムのシンプルでエレガントな、と保守が容易になります。
- 2は、Javaが提供する例外処理モデルを投げてキャッチされます。
- ステップ1:例外をスロー
- 例外は、例外はクラスオブジェクトを生成します発生し、実行中のプログラムは、オブジェクトは、例外のJavaランタイムシステムに提示されます
- 例外は、オブジェクトコードは、その後実行されませんスローされると、このプロセスは、スロー(スロー)は例外と呼ばれています。
- 例外オブジェクトを作成する方法:
- 1は、自動的に仮想マシンによって生成されます。プログラムが実行されている、仮想マシンは、問題が発生し、プログラムを検出した現在のコードならば、適切なハンドラを見つけられませんでした、
- それは自動的にバックグラウンドとスローに例外クラスを対応するオブジェクトのインスタンスを作成します - 自動的に投げます
- 開発者によって手動で作成2:例外例外=新たにClassCastException()。
- 同様に、プログラムに影響を与えない例外オブジェクトを投げると、共通のオブジェクトを作成しません良いの作成
- ステップ2:例外をキャッチ
- 異常が取得プロセスの異常で、2つの一般的な方法があります:1、のtry-catch-最後に2、スロー
- 3、モード1:ののtry-catch-最後に使用
- {試します
- //コードのブロックは、異常な表示されることがあります
- }キャッチ(例外の種類変数名1){//変数名使用Eは、交換することができます
- 例外を処理する方法1
- }キャッチ(例外タイプ2 2変数名){
- 例外を処理するには2つの方法
- // ...}実際の状況に基づいて、あなたはキャッチを複数設けることができます
- 最後に{
- // finallyブロックはデフォルトのスイッチの場合と同様に、オプションの設定を行います
- }
- 説明:
- 1、のtry-catch構造を入れ子にすることができます。
- 図2に示すように、例外コードブロックをラップしようと、異常動作時に発生すると、例外のオブジェクトクラスに対応して生成され、
- このオブジェクトの種類に応じて、それはcatch文と一致します。
- 図3は、キャッチの異常の種類に合わせて、異常試したら、キャッチは、文の処理を行います、
- (最終的には構造なし)のコードは、後続を実行するために、現在のtry-catch構造のうちに処理されます
- 4、それ以外の場合はエラーになり、子供の親は、任意の場所にすることができた場合に親子関係クラス、その上に、サブクラスの書き込みがある場合、重要ではありません例外タイプをキャッチ。
- 5、2つの従来の方法をキャッチ。図1に示すように、文字列のgetMessage()は、文字列、2printStackTrace()。void型の戻り値を返します。
- printStackTrace()も出力のgetMessage()の情報になります。もっと一般的な
- 6は、変数は構造トライローカル変数で定義されている、コールは括弧の外にすることはできません。最終的にも呼び出すことはできません。
- 7すぐのtry-catch構造を生成するために、日食は速いスピードの後のコードでサラウンドに包まれたコードのtry-catchを選択する権利を使用するように選択することができます。
- 4、最後に使用します
- 1つのキャッチ最後のステップの例外がfinally文で統一輸出例外処理を提供することであり、
- 制御フローは、前のプログラムの他の部分に行くような、それはプログラムの状態の一元管理が可能です。
- 2異常事象は、tryブロックで発生したか否か、catch文が実行され、
- 異常があるかどうかをcatch文リターンcatchステートメントがある場合、最終的にブロック文が実行されます。
- 3、最終的にcatchステートメントステートメントはオプションであり、
- try-catch設定値に対する出力戻り、それぞれニーズがでキャッチをしようとする場合は4は、この方法は、値を返します
- 戻り値を定義します。
- 最終的に、データベース接続、入出力ストリーム、ネットワークプログラミングソケットとして、使用される5は、自動的にJVMに回収することができません。
- 手動で閉じる必要がリソースを解放するためのコードは必ず閉じがメモリリークを防止することを確認、最終的に宣言する必要があります。
- 5、要約
- try-catch-最後にコンパイルされた異常処理構造を使用して1:00には、そのプログラムは、コンパイル時に指定されていないことが、実行時エラーではまだ可能です。
- 遅延実行時までに発生をコンパイルするときに発生する可能性のtry-catch-最終的な構造の使用に相当します。
- 異常2の開発を実行するために、より一般的な、それは異常な追加のtry-catch-最終的構造はに対して実行されていないことが多いです、
- そして、異常コンパイル時のために、それ以外のプログラムを実行することができない、のtry-catchを行うことを検討。
* /
package exception;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Date;
import java.util.InputMismatchException;
import java.util.Scanner;
public class Exception_Handle {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int num = 0;
try {
int i = 10;
num = 20;
System.out.println("请输入一个1-100范围内的整数");
int n = scan.nextInt(); //当在控制台输入小数时,报异常
if(n < 1 || n > 100) {
throw new RuntimeException("数据超出范围");//只抛出异常,没有捕获,程序不会执行后面的代码
}
System.out.println(n);
}catch(NullPointerException e) {//如果只有这个异常处理措施,则会自动抛出异常,因为异常类型不匹配
System.out.println("没有数据");
}catch(InputMismatchException a) {
a.getMessage();
System.out.println("输入数据类型错误");//异常捕获处理后,会继续执行后面的代码
}catch(Throwable e) {
System.out.println("天知道什么异常");//异常的父类写在后面,与if-else中的规则相同,包含关系中范围大的在后面
}
finally {
System.out.println("输入结束");
scan.close();
}
System.out.println(num);
// System.out.println(i);//try中的局部变量无法在外部使用
System.out.println("结束测试1");
try {
Object o = new Date();
String s = (String)o;
}catch(ClassCastException e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
System.out.println("结束测试2");
Exception_Handle test = new Exception_Handle();
int i = test.method();
System.out.println(i);
System.out.println("结束测试3");
test.method2();
System.out.println("结束测试4");
}
public int method() {
try {
String s = null;
System.out.println(s.charAt(1));
return Integer.parseInt(s);
}catch(NullPointerException e) {
e.printStackTrace();
// int[] array = new int[] {3,2,1,0};
// System.out.println(array[4]);//catch语句中可能也有异常,不影响finally语句的输出
return 404;
}catch(Exception e) {
e.printStackTrace();
return 502;
}finally {
System.out.println("Hello");
return 12;//finally中的return值是最终输出的值
}
}
public void method2(){
FileInputStream fis = null;
try {
File file = new File("E:\\eclipse-workspace\\Contacts\\bin\\2.txt");
fis = new FileInputStream(file);
int date = fis.read();
while(date != -1) {
System.out.print((char)date);
date = fis.read();
}
}catch(FileNotFoundException e) {
e.printStackTrace();
}catch(Exception e) {
e.printStackTrace();
}finally {
try {
if(fis != null) {//防止出现空指针异常,file可能无法找到,此时fis无法创建
fis.close();//当fis创建成功后,确保关闭。
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}