try-catch处理异常

try-catch处理异常本文详细介绍了 Java 中的异常处理 包括 try catch 用于捕获和处理异常 finally 确保某些代码无论如何都会执行 throw 用于方法内抛出异常 以及如何使用 throws 声明方法可能抛出的异常

大家好,欢迎来到IT知识分享网。

目录

1. try-catch处理异常

2. finally

3. throw 和 throws

3. 自定义异常

4. 总结

6. 内部类


1. try-catch处理异常

使用 try-catch 处理异常

try:表示将有可能出现异常的代码书写在 try 代码块中

catch:用于捕获 try 代码块中有可能出现的异常

try不能单独使用必须结合 catch 或者 finally 或者 catch-finally

catch不能单独使用  必须结合try

情况1:出现异常 并且能够被捕获到

public class TestTryCatch1 { public static void main(String[] args) { try{ Scanner in = new Scanner(System.in); System.out.print("请输入被除数:"); int num1 = in.nextInt(); System.out.print("请输入除数:"); int num2 = in.nextInt(); System.out.println(num1+"/"+ num2 +"="+ num1/ num2); } catch(InputMismatchException exception){ exception.printStackTrace(); // 打印异常堆栈信息 具体为 哪个类 哪一行 什么原因出错了 } System.out.println("感谢使用本程序!"); } }

情况2:出现异常  但是捕获的异常和出现的异常类型不匹配依然会中断程序

public class TestTryCatch2 { public static void main(String[] args) { try{ Scanner in = new Scanner(System.in); System.out.print("请输入被除数:"); int num1 = in.nextInt(); System.out.print("请输入除数:"); int num2 = in.nextInt(); System.out.println(num1+"/"+ num2 +"="+ num1/ num2); } catch(InputMismatchException exception){ exception.printStackTrace(); // 打印异常堆栈信息 具体为 哪个类 哪一行 什么原因出错了 } System.out.println("感谢使用本程序!"); } }

情况3:处理多种异常

可以书写多个catch块,注意:写多个catch处理异常 先写子类后写父类,否则编译报错

也可以使用 | 或运算符 分割 书写多个异常

public class TestTryCatch3 { public static void main(String[] args) { try{ Scanner in = new Scanner(System.in); System.out.print("请输入被除数:"); int num1 = in.nextInt(); System.out.print("请输入除数:"); int num2 = in.nextInt(); System.out.println(num1+"/"+ num2 +"="+ num1/ num2); } catch(InputMismatchException | ArithmeticException | NullPointerException exception){ exception.printStackTrace(); // 打印异常堆栈信息 具体为 哪个类 哪一行 什么原因出错了 } System.out.println("感谢使用本程序!"); } }

2. finally

finally:表示最终都会执行的代码,书写在 finally 代码块中

finally不能单独使用  必须结合 try 或者 try-catch

不执行finally 的唯一情况:在执行finally之前退出JVM虚拟机

System.exit(int status):表示退出JVM虚拟机  0表示正常退出,非0表示不正常退出

public class TestFinally1 { public static void main(String[] args) { try{ Scanner in = new Scanner(System.in); System.out.print("请输入被除数:"); int num1 = in.nextInt(); System.out.print("请输入除数:"); int num2 = in.nextInt(); System.out.println(num1+"/"+ num2 +"="+ num1/ num2); // System.exit(12345); } catch(InputMismatchException e){ e.printStackTrace(); } finally{ System.out.println("感谢使用本程序!"); } } }

值传递和引用传递:

finally面试题:

在 try 中return值,如果为基本数据类型,则在finally中对返回值的修改  不会改变原返回值

在 try 中return值,如果为引用数据类型,则在finally中对返回值的修改,会改变原返回值,比如数组类型

public class TestFinally2 { public static int getNum(){ int num = 10; try{ num++; return num; }catch(Exception e){ e.printStackTrace(); }finally{ num++; } return num; } public static int[] getNums(){ int [] nums = {1,2,3,4,5}; try{ return nums; }catch(Exception e){ e.printStackTrace(); }finally{ for(int i =0;i< nums.length;i++){ nums[i]++; } } return nums; } public static void main(String[] args) { System.out.println(getNum()); // 11 int[] nums = getNums(); System.out.println(Arrays.toString(nums)); } }

3. throw 和 throws

RuntimeException  运行时异常:RuntimeException 及其子类属于运行时异常,即程序运行期间出现异常

CheckedException 检查异常(受检异常):除运行时异常外,其余异常都属于检查异常

 

throw:

用于方法体内抛出异常,书写在方法体内,一句话只能抛出一个异常

        针对抛出的异常类型不同 决定书是否需要立即处理

        如果抛出的是运行时异常  则不必处理

        如果抛出的是检查异常  则必须处理  使用try-catch处理,或者用 throws 声明

throws:

用于定义方法的时候声明当前方法出现了哪些异常

        

针对声明的异常 根据不同的类型有两种处理方案:

        1.如果声明的运行时异常 则不必处理

        2.如果声明的是检查异常 则必须处理 使用try-catch处理 或者 继续声明给JVM虚拟机

try-catch处理异常

 

public class TestThrows { public static void m1() { throw new ArithmeticException("除数不能为0"); } public static void m2(){ throw new RuntimeException(); } public static void m3() throws NullPointerException{ throw new NullPointerException(); } public static void m4() throws ClassNotFoundException,IOException, SQLException { throw new ClassNotFoundException(); } public static void m5() throws IOException { throw new IOException(); } public static void m6(){ try { throw new IllegalAccessException(); } catch (IllegalAccessException e) { throw new RuntimeException(e); } } public static void main(String[] args) throws IOException { m1(); m2(); m3(); try { m4(); } catch (ClassNotFoundException | SQLException e) { throw new RuntimeException(e); } m5(); m6(); } }

3. 自定义异常

实际开发中,JDK提供异常不能满足我们的开发需求时,需要自定义异常

步骤:

1.继承Exception 或者 RuntimeException 二者其中之一

2.编写构造方法 调用父类的构造实现异常信息初始化

public class Student { private String name; private int age; private int score; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) throws InputAgeOutOfBoundsException { if(age >= 0 && age <= 130){ this.age = age; }else{ throw new InputAgeOutOfBoundsException("年龄不合法" + age); } } public int getScore() { return score; } public void setScore(int score) { if(score >= 0 && score <= 100 ){ this.score = score; }else{ throw new InputScoreException("分数不合法" + score); } } public static void main(String[] args) throws InputAgeOutOfBoundsException { Student stu1 = new Student(); stu1.setAge(999); stu1.setScore(888); } }
public class InputAgeOutOfBoundsException extends Exception{ public InputAgeOutOfBoundsException(String message){ super(message); } } 
public class InputScoreException extends RuntimeException{ public InputScoreException(String message){ super(message); } }

4. 总结

异常处理与性能

异常只能用于非正常情况

不要将过于庞大的代码块放在try中

在catch中指定具体的异常类型

需要对捕获的异常做处理

6. 内部类

内部类:即一个类中 再书写其他的类

普通内部类

静态内部类

局部内部类

匿名内部类

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/112818.html

(0)
上一篇 2026-01-15 21:15
下一篇 2026-01-15 21:26

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信