プログラムの実行中に予期しないイベントが発生し、プログラマの期待どおりにプログラムが正常に実行されない場合、これは例外です。例外が発生すると、プログラムは自動的に対処し、ただちに終了します。 Java の場合、Java のコンパイル中、操作中、または操作中に発生するエラー。
Java は、例外処理メカニズムというより優れたソリューションを提供します。
例外処理メカニズムを使用すると、例外が発生したときにプログラムがコードの事前設定された例外処理ロジックに従って対象を絞った方法で例外を処理できるため、プログラムは通常に戻り、可能な限り実行を継続できます。コードの明瞭さを維持しながら。
Java の例外は、関数内のステートメントが実行されるときに発生することも、プログラマが throw ステートメントを通じて手動でスローすることもできます。Java プログラムで例外が発生する限り、例外は対応する型のオブジェクトは例外をカプセル化するために使用され、JRE は例外を処理する例外ハンドラーを見つけようとします。
例外とは、実行時に発生する異常な状況を指します。
異常な状況が説明され、オブジェクトは Java のクラスの形式でカプセル化されます。
class FuShuIndex extends Exception{ //构造函数 和类名一样 FuShuIndex(){ } //定义一个带参数的构造函数 FuShuIndex(String msg){ //调用Exception中的带参数异常函数 super(msg); } } 主函数 throws FuShuIndex:{ int[] arr = new int[3]; method(arr,-7); } public static int method(int[] arr,int index) throws arrIndexexception { if (index<0){ throw new arrIndexexception("数组的角标不能为负数"); } return arr[index]; }
try{ //需要被检测异常的代码 } catch(异常类 变量)//该变量用于接收发生的异常对象{ //处理异常代码 } finally{ //一定会被执行的代码 }
class FuShuIndex extends Exception{ //构造函数 和类名一样 FuShuIndex(){ } //定义一个带参数的构造函数 FuShuIndex(String msg){ //调用Exception中的带参数异常函数 super(msg); } }
{ int[] arr = new int[3]; try{ method(arr,-7); }catch(arrIndexexception a){ a.printStackTrace();//jvm默认的异常处理机制就是调用异常对象的这个方法。 System.out.println("数组的角标异常!!!");//自定义捕获后打印的信息 System.out.println(a.toString());//打印该异常对象的信息 System.out.println(a.getMessage());//获取我们自定义抛出所定义的信息 } } public static int method(int[] arr,int index) throws arrIndexexception { if (index<0){ throw new arrIndexexception("数组的角标不能为负数"); } return arr[index]; }
一个功能如果抛出了多个异常,那么调用时,必须有对应的多个catch来进行针对性处理。
内部有几个需要检测的异常,就抛几个异常,抛出几个就catch几个异常。
通常用于关闭(释放)资源。必须要执行。除非jvm虚拟机挂了。
范例:出门玩,必须关门,所以将关门这个动作放在finally里面,必须执行。
凡是涉及到关闭连接等操作,要用finally代码块来释放资源。
try catch finally 代码块组合特点:
try catch finally:当有资源需要释放时,可以定义finally
try catch(多个):当没有资源需要释放时,可以不定义finally
try finally:异常处理不处理我不管,但是我得关闭资源,因为资源是我开的,得在内部关掉资源。
范例:
try{ //连接数据库 } //没有catch意思不处理异常,只单纯的捕获异常 finally{ //关闭连接 }
老师用电脑讲课范例:
电脑类:
public class Computer { private int state = 2; public void run() throws lanpingExcption,maoyanExcption{ if (state == 1){ throw new lanpingExcption("电脑蓝屏啦~"); }else if (state == 2){ throw new maoyanExcption("电脑冒烟啦~"); } System.out.println("电脑启动"); } public void chongqi(){ state = 0; System.out.println("重启电脑!"); } }
老师类:
public class Teacher { private String name; private Computer computer; Teacher(String name){ this.name = name; computer = new Computer(); } void teach() throws maoyanExcption{ try { computer.run(); System.out.println(this.name + "开始用电脑讲课了"); } catch (lanpingExcption l) { l.printStackTrace(); computer.chongqi(); teach();//重启后再次讲课 } catch (maoyanExcption m) { m.printStackTrace(); test(); throw m; } } public void test(){ System.out.println("大家自己练习去~"); } }
蓝屏异常类:
public class lanpingExcption extends Exception{ lanpingExcption (String msg){ super(msg); } }
冒烟异常类:
public class maoyanExcption extends Exception { maoyanExcption (String msg){ super(msg); } }
主函数:
public class Testmain { public static void main (String[] args){ Teacher teacher = new Teacher("丁老师"); try { teacher.teach(); } catch (maoyanExcption m) { //m.printStackTrace(); System.out.println("。。。。。"); } } }
子类在覆盖父类方法时,父类的方法如果抛出了异常,那么子类的方法只能抛出父类的异常或者该异常的子类。
如果父类抛出多个异常,那么子类只能抛出父类异常的子集。
子类覆盖父类,只能抛出父类的异常或者子类。
如果父类的方法没有抛出异常,子类覆盖时绝对不能抛。
以上がJava で例外タイプを処理する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。