異常な
凹凸のクラスのJavaでパッケージオブジェクトの形式で記載されています。例外クラスと呼ばれる、異常な事態クラスを記述。コードと前の通常のプロセス処理コードの問題は、読みやすさを向上させるために、今通常のコードとコード処理の問題を流れを組み合わせます。実際には、例外Javaオブジェクト指向の問題を通して考えているのは、例外クラスを記述することで、オブジェクトパッケージになりました。別の問題は、具体的には、添字境界、ヌルポインタとして異なるクラス、説明します。多くの問題は、クラスは、一般的に策定されたロットを、記述システムの異常を形成することを意味する、最終的な質問(異常な状態)は2つのカテゴリに分けることができる:エラーと例外(異常)。
コンセプト
- 運転中に発生した異常な状況で
例外は、例外は、例外オブジェクトを作成し、例外オブジェクトをスローすることで、クラスです。
Javaは例外処理割り込み処理する方法です。
構文エラー、間違った文法を参照していない異常、コンパイラは実行されませんが、バイトコードファイルを生成しません、合格していません
例外のルートクラスのThrowable
機能
- Throwableのとそのサブクラスは、すべての使い捨ての性質を持っています
- 拡張接尾辞としての彼の父、強い読書とクラス名のサブクラスであります
分類
エラー
問題の深刻度は、直接プログラムを修正し、この問題は、一般的に治療を目的とされていない、JVMがスローされます。
例外(異常)
機能
例外が発生すると、コードによって補正することができ、プログラムが処理されなければならないこと、実行し続けます。
カテゴリー:コンパイル時によるか、二つのタイプに分け異常をチェックする時間を実行します。
異常なコンパイル時:異常確認
例外を処理できない場合は、コンパイル時には、それは、チェックします、コンパイラは失敗します。(例えば、日付の書式の例外)
カテゴリー:特別サブカテゴリシステムのRuntimeExceptionに加えて、例外とそのサブクラスです。
- IOExceptionが
- ClassNotFoundException
- CloneNotSupportException
異常な動作時間:実行時の異常
直接の異常、時間を実行し、コンパイルします。
- RuntimeException及びそのサブクラス
一般的な方法
公共のボイドのprintStackTrace()
- 例外の詳細を印刷します。
- 異常の種類が含まれて、異常の原因、さらに異常の位置を含みます、
公共の文字列のgetMessage()
- 例外が発生した理由は、取得します。
- それは間違った理由を促し、ユーザーに。
異常な生成プロセス
添字境界例外(下記ArrayIndexOutofBoundsException
)は、例えば、次のように
public class ExceptionDemo {
public static void main(String[] args) {
int[] arr = { 34, 12, 67 };
int num = ArrayTools.getElement(arr, 4);
System.out.println("num=" + num);
System.out.println("over");
}
}
class ArrayTools {
// 对给定的数组通过给定的角标获取元素。
public static int getElement(int[] arr, int index) {
int element = arr[index];
return element;
}
}
ダイヤグラム
例外が発生した後、関数が終了し、後者のステートメントは、以下のコードをカスタマイズするには、この場合には、異常情報を自分自身を例外をスローし、アクセスできなくなります。
class ArrayTools {
// 对给定的数组通过给定的角标获取元素。
public static int getElement(int[] arr, int index) {
if(arr == null)
throw new NullPointerException("数组的引用不能为空"); //throw抛出一个异常对象
if(index >= arr.length)
throw new ArrayIndexOutOfBoundsException("数组越界了:"+index);
if(index < 0)
throw new ArrayIndexOutOfBoundsException("数组的角标不能为负数:"+index);
int element = arr[index];
return element;
}
}
例外を投げます
このような異常のようなJavaプログラムの実行時には、例外クラスのオブジェクトを生成し、例外オブジェクトは、Javaランタイムシステムとして知られているプロセスに提出される投(スロー)例外。
フォーマット:新しい例外クラス名を投げる(パラメータ)
例えば:
throw new NullPointerException("要访问的arr数组不存在");
throw new ArrayIndexOutOfBoundsException("该索引在数组中不存在,已超出范围");
Exceptionオブジェクトが生成さ:
自動生成:プログラムが実行されている仮想マシンは問題がプログラムで発生した検出し、適切なハンドラが現在のコードで見つからない場合は、それが自動的にオブジェクトのインスタンスを作成します背景とスローの異常のクラスに対応
例外例外=新しいClassCastExceptionが();のように、プログラムに影響を与えない例外オブジェクトを投げると、共通のオブジェクトを作成しません良い作成:手動で作成します
例えば:
package java_demo_2.exceptiondemo;
/**
* @ClassName: Demo02_Exception
* @author: benjamin
* @version: 1.0
* @description: TODO
* @createTime: 2019/07/21/15:47
*/
public class Demo02_Exception {
public static void main(String[] args) {
//创建一个数组
int[] arr = {2, 4, 52, 2};
//根据索引找对应的元素
int index = 4;
int element = getElement(arr, index);
System.out.println(element);
System.out.println("over");
}
/*
根据 索引找到数组中对应的元素
*/
public static int getElement(int[] arr, int index) {
//判断 索引是否越界
if (index < 0 || index > arr.length - 1) {
/*
判断条件如果满足,当执行完throw抛出异常对象后,方法已经无法继续运算。
这时就会结束当前方法的执行,并将异常告知给调用者。这时就需要通过异常来解决。
*/
throw new ArrayIndexOutOfBoundsException("哥们,角标越界了~~~");
}
int element = arr[index];
return element;
}
}
結果:
その後、我々は戻って、発信者に問題の後、呼び出し側が2つのメソッドを使用する必要があり、1は、請求処理を投げる使用して文を発行し続けることで、他のプロセスをキャプチャすることです、つまり、経由例外をスローした後にスローされます。
例外処理システム
例外が発生した場合、我々はすぐにプログラムを終了しますので、私たちは、例外を処理する必要があります。
- この方法では処理されませんが、(スロー)に対処するためのメソッドの呼び出し元で声明を出しくぼみました。
- この方法では文のtry-catchブロックを使用して例外を処理します。
声明では、例外がスローされます
コンセプト
これは、現在のメソッドが例外を処理しないことを示しているのではなく、例外を処理するメソッドの呼び出し元を思い出させます。
フォーマット
修飾戻り型メソッド名(パラメータ)} {例外クラス1、2 ...例外クラスをスロー
注意:の方法で例外リストを投げる宣言文をスローし、例外タイプは、背後にあるその親であってもよいし、例外タイプは、プロセスで製造することができるがスローされます。
投げるとの違いをスローします
スロー
- オブジェクトのスロー
- 関数内で使用
- 例えば、新しい例外クラス名(パラメータ)を投げる:新しいNullPointerExceptionがスロー(「ARR配列は存在しませんアクセスされます」);
スロー
- 例外クラスを投げます
- 機能に使用されます
- 可以抛多个,用
,
隔开
捕获异常try...catch...
概念
Java中对异常有针对性的语句进行捕获,可以对出现的异常进行指定方式的处理。
格式
try{
编写可能会出现异常的代码
}catch(异常类型 e){
处理异常的代码
//记录日志/打印异常信息/继续抛出异常
}
使用finally代码块
- try...catch....finally:自身需要处理异常,最终还得关闭资源。
- 不论在try代码块中是否发生了异常事件, catch语句是否执行, catch语句是否有异常, catch语句中是否有return,finally块中的语句都会被执行
- 当只有在try或者catch中调用退出JVM的相关方法,此时finally才不会执行,否则finally永远会执行
注意
多个异常采用一次捕捉多次处理
格式
try{ 编写可能会出现异常的代码 }catch(异常类型A e){ 当try中出现A类型异常,就用该catch来捕获. 处理异常的代码 //记录日志/打印异常信息/继续抛出异常 }catch(异常类型B e){ 当try中出现B类型异常,就用该catch来捕获. 处理异常的代码 //记录日志/打印异常信息/继续抛出异常 }
注意
如果父类抛出了多个异常,子类重写父类方法时,抛出和父类相同的异常或者是父类异常的子类或者不抛出异常。
父类方法没有抛出异常,子类重写父类该方法时也不可抛出异常。此时子类产生该异常,只能捕获处理,不能声明抛出
自定义异常类
概念
对于负数为角标的情况,自己自定义一个用负数角标异常来表示。负数角标这种异常在java中并没有定义过,按照java异常的创建思想,将负数角标进行自定义描述,并封装成对象。这种自定义的问题描述称为自定义异常。
一般地,用户自定义异常类都是RuntimeException的子类。
自定义异常类通常需要编写几个重载的构造器。
自定义异常需要提供serialVersionUID
自定义的异常通过throw抛出。
自定义异常最重要的是异常类的名字,当异常出现时,可以根据名字判断异常类型。
步骤
自定义一个异常类XxxException,继承现有的异常类
自定义编译期异常 :自定义类并继承于java.lang.Exception
自定义运行时期异常:自定义类并继承于java.lang.RuntimeException
使用到自定义异常的其他类
方法上:throws 异常类名;
方法内:throw new 异常类名(参数);
代码举例:
模拟注册操作,如果用户名已存在,则抛出异常并提示:亲,该用户名已经被注册。
定义一个异常类: RegisterException继承与Exceptions
模拟登录操作,使用数组模拟数据库中存储的数据,并提供当前注册账号是否尊才方法用于判断。
// 登录异常类 public class RegisterException extends Exception{ public RegisterException() { super(); } public RegisterException(String message) { super(message); } } //自定义一个使用异常的类 class Demo{ //模拟数据库中已存在的账号 private static String[] names = {"admin","tony","benjie"}; public static void main(String[] args) { // 从键盘输入一个名字 Scanner scanner = new Scanner(System.in); System.out.println("请输入一个名字:"); String uname = scanner.next(); // 调用方法 try { checkUserName(uname); } catch (Exception e) { e.printStackTrace(); } } public static boolean checkUserName(String uname) throws Exception{ for(String name: names){ if(name.equals(uname)){ throw new RegisterException("亲"+uname+"已经被注册了!"); } } return true; } }
总结:
异常处理的5个关键字
try:执行可能产生异常的代码
catch:捕获异常
finally:无论是否发生异常,代码总被执行
throw:抛出异常。异常的生成阶段,手动抛出异常对象。throw new 异常类名(参数),例如:throw new NullPointerException("要访问的数组不存在");
throws:声明异常。异常的处理方式,声明方法可能要抛出的各种异常类。