继承中 方法重写异常
父类中抛出异常
// 子类可以不抛出异常
// 子类也可以抛出异常
class Father{
public void fun() throws Exception{
}
}
class Son extends Father{
@Override
public void fun(){
}
}
父类中没有抛出异常
//子类不能抛出异常
class Father{
public void fun(){
}
}
class Son extends Father{
@Override
// 会发生编译异常
public void fun() throws Exception{
}
}
子类重写父类方法时调用了一个有异常的方法
//只能选择try...catch处理 不能抛出
class Father{
public void fun(){
}
}
class Son extends Father{
@Override
public void fun(){
try {
method();
} catch(Exception e){
e.printStackTrace();
}
}
// 带异常的方法
public void method() throws Exception{
}
}
练习
/*
* 获取数字的工具类
* 要求:从键盘输入 输入的是字符串要处理异常重新输入
*
*封装一个有两个数的对象类
* 要求:类中有两个int数字 作为成员变量
*
* 封装自定义异常类
* 要求:类名表示除法除数不能为0
*
* 封装运算类
* 1.获取 两个数的对象
* 2.获取 要做的运算法则 加法或者除法
* 输入数字1是加法 2是除法(输入错误 要重新输入)
* 3.加法方法
* 4.除法方法(要求捕获异常 并抛出自定义异常)
* 5.根据运算法则 执行运算 并返回运算结果
* 除数如果是0 要重新输入数字
*
* 测试类:
* 对以上方法进行测试
*/
//获取数字的工具类
//一般工具类里写的都是静态方法
//一般工具类中构造方法都需要私有化构造方法
public class IntTools{
// 私有化构造方法
private IntTools(){
}
// 这里有两种方法 使用哪种都行
//方法一 使用递归
public static int getIntNum{
System.out.println("请输入数字");
Scanner scanner = new Scanner(System.in);
String string = scanner.nextLine();
try{
// 字符串转数字
int num = Integer.parseInt(string);
return num;
} catch(Exception e){
System.out.println("输入错误,请重新输入");
// 再次调用本方法 进行数字输入
return getIntNum();
}
}
//方法二 使用循环
public static int getIntNum2(){
System.out.println("请输入数字");
Scanner scanner = new Scanner(System.in);
while(true){
//接收从键盘输入的值
String string = scanner.nextLine();
try{
// 字符串转数字
int num = Integer.parseInt(string);
return num;
} catch(Exception){
System.out.println("输入错误,请重新输入");
}
}
}
}
// 封装一个有两个数的对象类
// 要求:类中有两个int数字 作为成员变量
public class MyNum{
private int a;
private int b;
public MyNum(){
}
public MyNum(int a, int b){
this.a = a;
this.b = b;
}
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
public int getB() {
return b;
}
public void setB(int b) {
this.b = b;
}
@Override
public String toString() {
return "MyNum [a=" + a + ", b=" + b + "]";
}
}
// 封装自定义异常类
public class DivNotZeroException extends Exception {
public DivNotZeroException(){
}
public DivNotZeroException(String message){
super(message);
}
}
/* 封装运算类
* 1.获取 两个数的对象
* 2.获取 要做的运算法则 加法或者除法
* 输入数字1是加法 2是除法(输入错误 要重新输入)
* 3.加法方法
* 4.除法方法(要求捕获异常 并抛出自定义异常)
* 5.根据运算法则 执行运算 并返回运算结果
* 除数如果是0 要重新输入数字
*/
public class Operation{
//获取 两个数的对象
int num = IntTools.getIntNum();
int num2 = IntTools.getIntNum();
Mynum myNum = new MyNum(num, num2);
return myNum;
}
//获取 要做的运算法则 加法或者处罚
//输入数字1 是 加法 2 是处罚(输入错误 要重新输入)
public String getChooseMethod(){
System.out.println("输入数字1是加法 2是除法(输入错误 要重新输入)");
//这里要从键盘接收一个数字
//可以再次调用之前那个从键盘输入的方法
int num = IntTools.getIntNum();
//判断数字 返回要做的运算
if(num == 1){
return "+";
}else if(num == 2) {
return "/";
}else {
System.out.println("只能输入1或2");
//输入的不是1或者2 就让用户重新输入人
return getChooseMethod();
}
}
// 加法方法
public int sum(MyNum myNum){
return myNum.getA() + myNum.getB();
}
//除法方法(要求捕获异常 并抛出自定义异常)
public int div(MyNum myNum) throws DivNotZeroException {
try{
return myNum.getA() / myNum.getB();
} catch(Exception e){
// 获取到这个异常 但是不处理
// 交给方法的调用者去处理
// 抛出异常 交给调用者去处理
throw neww DivNoZeroException("除数为0")
}
}
// 根据运算法则 执行运算 并返回运算结果
// 除数如果是0 要重新输入数字
public int getResultByOperactAndMyNum(String operact,MyNum myNum){
// 判断操作符 去做相应的运算
if(operact.equals("+")){
return sum(myNum);
}
// 除法 如果报了异常 说明除数为0
// 需要重新输入两个数
try{
return div(myNum);
} catch(DivNotZeroException e){
System.out.println(e.getMessage());
System.out.println("请重新输入两个数");
// 重新调用获取两个数对象的方法
MyNum newNum = getMyNum();
// 重新调用运算的方法 进行运算
return getResultByOperactAndMyNum(operact, newNum);
}
}