Melemparkan pengecualian apabila melaksanakan kaedah, jika pengecualian dihantar, kaedah ini menjana objek yang mewakili pengecualian dan menghentikan arus. jalan pelaksanaan dan serahkan pengecualian kepada jre.
Tangkap pengecualian: Selepas jre mendapat pengecualian, ia memalsukan kod yang sepadan untuk mengendalikan pengecualian. jre mencari dalam timbunan panggilan kaedah dan menjejak kembali daripada kaedah yang menjana pengecualian sehingga ia menemui kod pengendalian pengecualian yang sepadan.
Ok, kini kita tahu apa definisi pengecualian, jadi bagaimana kita harus melakukannya Catch pengecualian dan kemudian mengendalikannya.
Mula-mula kita lihat sekeping kod:
package AbnormalTest; import java.util.InputMismatchException; import java.util.Scanner; public class test1 { public static void main(String[] args) { Scanner input = new Scanner(System.in); try { System.out.print("请输入被除数:"); int a = input.nextInt(); System.out.print("请输入除数:"); int b = input.nextInt(); int sum = b/a; System.out.println("结果是:"+sum); System.out.println("程序无异常,执行完毕!"); }catch (Exception e){ //通用异常 //printStackTrace()方法是将堆栈异常的错误信息打印出来(后期学习框架后我们一般提交或 者回滚事务) e.printStackTrace(); System.out.println("程序异常,请重试!"); return ; }finally { //不管是否发生了异常,都会执行finally内的代码,通常用于资源的关闭 System.out.println("------------------------------"); System.out.println("程序结束,资源已经关闭,欢迎再次使用"); input.close(); //关闭Scanner对象,节省资源 } } }
Penjelasan kod:
Terdapat struktur try-catch-finally dalam kod di atas.
cuba: Kami menggunakan try untuk memasukkan kod yang boleh menyebabkan pengecualian
catch: Selagi pengecualian berlaku apabila kod dalam blok try code sedang berjalan, catch akan dimasukkan untuk menangkap pengecualian
akhirnya: Tidak kira bagaimana kod sebelumnya dilaksanakan, blok kod akhirnya akan dilaksanakan! !
Contoh keputusan berjalan:
Biasa:
Pengecualian:
Apabila dividen adalah 0, An pengecualian akan dicetuskan dan ditangkap dalam catah, tetapi tidak kira sama ada terdapat pengecualian, output program dalam akhirnya akan dilaksanakan: program telah tamat, sumber telah ditutup, dialu-alukan untuk menggunakan semula
Kami tahu bahawa mungkin terdapat lebih daripada satu pengecualian dalam sekeping kod, contohnya, dalam kod di atas pengecualian apabila dividen dibahagikan dengan 0, atau mungkin terdapat pengecualian input apabila aksara dimasukkan untuk pengiraan, atau mungkin terdapat Terdapat pengecualian pemformatan digital, dsb., jadi kita boleh menggunakan multi-tangkapan untuk menangkap pengecualian:
Atau ambil kod di atas sebagai contoh:
import java.util.InputMismatchException; import java.util.Scanner; public class test1 { public static void main(String[] args) { Scanner input = new Scanner(System.in); try { System.out.print("请输入被除数:"); int a = input.nextInt(); System.out.print("请输入除数:"); int b = input.nextInt(); int sum = b/a; System.out.println("结果是:"+sum); System.out.println("程序无异常,执行完毕!"); }catch (InputMismatchException e){ //多重catch结构,这里捕捉输入异常 e.printStackTrace(); System.out.println("程序输入异常,请重试!"); }catch (Exception e){ //这里捕捉通用异常(其他异常都可以在这里进行捕捉) e.printStackTrace(); System.out.println("程序异常,请重试!"); return ; }finally { //不管是否发生了异常,都会执行finally内的代码,通常用于资源的关闭 System.out.println("------------------------------"); System.out.println("程序结束,资源已经关闭,欢迎再次使用"); input.close(); //关闭Scanner对象,节省资源 } } }
Apabila input bukan nombor:
Dengan cara ini kita dapat melihat bahawa ia mempunyai telah ditangkap dalam tangkapan pertama
Andaikan saya mentakrifkan kaedah dan memaklumkan bahawa kaedah itu mungkin menghantar beberapa jenis pengecualian (diisytiharkan pengecualian). pemanggil mesti mengendalikan pengecualian apabila memanggil kaedah.
Mula-mula kita mentakrifkan kelas ralat:
Kelas pelajar:
package ExceptionText; /** * 异常测试 */ public class Student { private String name; private int age; private char sex; public void setName(String name) { this.name = name; } public String getName() { return name; } public int getAge() { return age; } public char getSex() { return sex; } public void setAge(int age) throws Exception { if (age < 101 && age > 0) { this.age = age; } else { throw new Exception("年龄输入有误!"); } } public void setSex(char sex) throws Exception { if (sex == '男' || sex == '女') { this.sex = sex; } else { throw new Exception("性别输入有误"); } } }
Kelas ujian:
package ExceptionText; public class TestMain { public static void main(String[] args) { Student stu = new Student(); stu.setName("小红"); try { stu.setAge(50); stu.setSex('k'); System.out.println("我叫:"+stu.getName()+"年龄:"+stu.getAge()+"我的性别是:"+stu.getSex()); } catch (Exception e) { e.printStackTrace(); } } }
Apabila kemasukan dan keluar adalah betul:
Apabila umur dimasukkan dengan salah:
Apabila jantina dimasukkan dengan salah:
Nota: Jika terdapat berbilang pengecualian, pengecualian pertama yang berlaku akan dibuang.
Apabila subkelas pengecualian masa jalan RuntimeException tidak dapat memenuhi keperluan kami, kami juga boleh menyesuaikan pengecualian masa jalan dan membuang Maklumat pengecualian tersuai untuk memenuhi keperluan kami, tetapi sila ambil perhatian: Tersuai pengecualian runtime mesti mewarisi RuntimeException! ! !
Kelas pengecualian tersuai:
//这个类是继承了RuntimeException public class AgeException extends RuntimeException { //构造方法 public AgeException(String message) { super(message); } }
Kelas maklumat pelajar:
package CustomizeException; public class Student { private String name; private int age; private char sex; public void setName(String name) { this.name = name; } public String getName() { return name; } public int getAge() { return age; } public char getSex() { return sex; } //方法 //使用throws 来声明异常,就是这个方法内可能存在异常,先事先声明 public void setAge(int age) throws Exception { if (age < 101 && age > 0) { this.age = age; } else { //如果不符合上面的if判断 throw new Exception("年龄输入有误!"); //这里就要用thrwo 来抛出异常, } } public void setSex(char sex) throws Exception { if (sex == '男' || sex == '女') { this.sex = sex; } else { throw new AgeException("这是自定义异常,性别输入有误"); } } }
Kelas ujian:
package ExceptionText; public class TestMain { public static void main(String[] args) { Student stu = new Student(); stu.setName("小红"); try { stu.setAge(18); stu.setSex('女'); System.out.println("我叫:"+stu.getName()+"年龄:"+stu.getAge()+"我的性别是:"+stu.getSex()); } catch (Exception e) { e.printStackTrace(); } } }
Bahagian kod ini konsisten dengan bahagian ketiga di atas , anda boleh rujuk contoh di atas.
Atas ialah kandungan terperinci Contoh analisis mekanisme pengendalian pengecualian Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!