第一题:分析题
package chapter09_exception_teacher.src.com.atguigu05.exer.exer2; /** * 输出结果: * 进入方法A * 用A方法的finally * 制造异常 * 进入方法B * 调用B方法的finally * * @author shkstart * @create 0:57 */ public class ReturnExceptionDemo { static void methodA() throws Exception{ try { System.out.println("进入方法A"); throw new Exception("制造异常"); } finally { System.out.println("用A方法的finally"); } } static void methodB() { try { System.out.println("进入方法B"); return; } finally { System.out.println("调用B方法的finally"); } } public static void main(String[] args) { try { methodA(); } catch (Exception e) { System.out.println(e.getMessage()); } methodB(); } }
第二题
案例:游戏角色 在一款角色扮演游戏中,每一个人都会有名字和生命值,角色的生命值不能为负数。 要求:当一个人物的生命值为负数的时候需要抛出自定义的异常 操作步骤描述: (1)自定义异常类NoLifeValueException继承RuntimeException ①提供空参和有参构造 ②在有参构造中,需要调用父类的有参构造,把异常信息传入 (2)定义Person类 ①属性:名称(name)和生命值(lifeValue) ②提供setter和getter方法: 在setLifeValue(int lifeValue)方法中,首先判断,如果 lifeValue为负数,就抛出NoLifeValueException, 异常信息为:生命值不能为负数:xx; 然后再给成员lifeValue赋值。 ③提供空参构造 ④提供有参构造:使用setXxx方法给name和lifeValue赋值 (3)定义测试类Exer3 ① 使用满参构造方法创建Person对象,生命值传入一个负数 由于一旦遇到异常,后面的代码的将不在执行,所以需要注释掉上面的代码 ② 使用空参构造创建Person对象 调用setLifeValue(int lifeValue)方法,传入一个正数,运行程序 调用setLifeValue(int lifeValue)方法,传入一个负数,运行程序 ③ 分别对①和②处理异常和不处理异常进行运行看效果
package chapter09_exception.src.com.atguigu05.exer.exer3; /** * ClassName: Exer3 * Package: chapter09_exception.src.com.atguigu05.exer.exer3 * Description: * * (3)定义测试类Exer3 * * ① 使用满参构造方法创建Person对象,生命值传入一个负数 * * 由于一旦遇到异常,后面的代码的将不在执行,所以需要注释掉上面的代码 * * ② 使用空参构造创建Person对象 * * 调用setLifeValue(int lifeValue)方法,传入一个正数,运行程序 * * 调用setLifeValue(int lifeValue)方法,传入一个负数,运行程序 * * ③ 分别对①和②处理异常和不处理异常进行运行看效果 * * @Author 小白 * @Create 2024/4/6 16:09 * @Version 1.0 */ public class Exer3 { public static void main(String[] args) { //正常 // Person p1 = new Person("Tom",10); // System.out.println(p1.toString()); //Person{name='Tom', lifeValue=10} // 执行过程: // 如果我们给它赋值一个负数的话 就在Person("Tom",-10)构造器里面赋值了一个负数 // 然后在构造器里面 Person(String name, int lifeValue)又调用了 setLifeValue(lifeValue); // //也就是说把负数传递给 setLifeValue(lifeValue);这个方法 在setLifeValue(lifeValue)进行判断 // //如果lifeValue < 0 则抛出 NoLifeValueException异常 并且输出生命值不能为负数:"+lifeValue // //public void setLifeValue(int lifeValue) { // // if (lifeValue < 0){ // // throw new NoLifeValueException("生命值不能为负数:"+lifeValue); // // } // // // this.lifeValue = lifeValue; // } // // 又因为抛出的是运行时异常RuntimeException 所以我们不用进行处理 // 因为异常不处理 所以只能往上抛出 // setLifeValue(int lifeValue)方法的调用者是构造器Person(String name, int lifeValue) // 所以我们又把异常抛出给构造器Person(String name, int lifeValue) 到这 程序执行完毕 运行时会在控制台显示 //自定义异常NoLifeValueException // /* // public Person(String name, int lifeValue) { // //调用 setName 把name传入 // setName(name); // this.name = name; // 调用 setLifeValue() 把lifeValue传入 // setLifeValue(lifeValue); // } // //运行时异常 选择不处理 // Person p1 = new Person("Tom",-10); // System.out.println(p1.toString()); //如果要处理 try { Person p1 = new Person("Tom",-10); System.out.println(p1.toString()); } catch (NoLifeValueException e) { e.printStackTrace(); } //2.使用空参构造器 Person p2 = new Person(); p2.setName("Jerry"); p2.setLifeValue(-10); } }
第三题
编写应用程序DivisionDemo.java,接收命令行的两个参数,要求不能输入负数,计算两数相除。 对数据类型不一致(NumberFormatException)、缺少命令行参数(ArrayIndexOutOfBoundsException、 除0(ArithmeticException)及输入负数(BelowZeroException 自定义的异常)进行异常处理。 提示: (1)在主类(DivisionDemo)中定义异常方法(divide)完成两数相除功能。 (2)在main()方法中调用divide方法,使用异常处理语句进行异常处理。 (3)在程序中,自定义对应输入负数的异常类(BelowZeroException)。 (4)运行时接受参数 java DivisionDemo 20 10 //args[0]="20" args[1]="10" (5)Interger类的static方法parseInt(String s)将s转换成对应的int值。 如:int a=Interger.parseInt("314"); //a=314;
package chapter09_exception.src.com.atguigu05.exer.exer4; import chapter09_exception.src.com.atguigu04.BelowZeroException; /** * ClassName: DivisionDemo * Package: chapter09_exception.src.com.atguigu05.exer.exer4 * Description: *编写应用程序DivisionDemo.java,接收命令行的两个参数,要求不能输入负数,计算两数相除。 * 对数据类型不一致(NumberFormatException)、缺少命令行参数(ArrayIndexOutOfBoundsException、 * 除0(ArithmeticException)及输入负数(BelowZeroException 自定义的异常)进行异常处理。 * * 提示: * (1)在主类(DivisionDemo)中定义异常方法(divide)完成两数相除功能。 * (2)在main()方法中调用divide方法,使用异常处理语句进行异常处理。 * (3)在程序中,自定义对应输入负数的异常类(BelowZeroException)。 * (4)运行时接受参数 java DivisionDemo 20 10 //args[0]="20" args[1]="10" * (5)Interger类的static方法parseInt(String s)将s转换成对应的int值。 * 如:int a=Interger.parseInt("314"); //a=314; * @Author 小白 * @Create 2024/4/6 16:44 * @Version 1.0 */ public class DivisionDemo { public static void main(String[] args) { try { int m = Integer.parseInt(args[0]); int n = Integer.parseInt(args[1]); int result = divide(m, n); System.out.println("结果为:" + result); }catch (BelowZeroException e) { System.out.println(e.getMessage()); } catch (NumberFormatException e) { System.out.println("数据类型不一致"); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("缺少命令行参数"); } catch (ArithmeticException e) { System.out.println("除0"); } } public static int divide ( int m, int n) throws BelowZeroException { if (m < 0 || n < 0) { //手动抛出异常类的对象 throw new BelowZeroException("输入负数了"); } return m / n; } }
测试
先来个正常的
少一个和什么都没写是一样的