为什么匿名内部类只能在自己的类里面处理异常,不能在主函数处理异常。
1楼, 心寒丶
3楼, loliconRoot
回答的很正确
不是因为他是匿名内部类才不能处理异常, 而是Override注解重写的方法 父方法没抛异常, 子方法也是不能抛, 父方法抛了异常, 子方法只能抛出 这个异常或者该异常的子类, 也可以不抛, 一句话: Override注解重写的方法抛出的异常只能 "小于等于父类" , 也可以不抛, 还有权限修饰符 public private protected 类似
**问题2: ** 不能在主函数处理异常。
哥们, 你写的是一个类啊, 匿名内部类也是类,相当于一个java文件, 懂? 难道这个类有异常?
异常只出现在方法上的, 方法里的异常只能往方法声明上 "抛", 怎么能抛到main方法呢? 中间还有个类声明的 大括号呢, 你无视大括号的作用范围了
这个就相当于以下这样,异常肯定是在方法内部try catch 捕获或者方法名称处 throws Exception,实际上跟main方法没啥关系
Thread t1=new Thread(new MyRunnable());
public class MyRunnable implements Runnable{
@Override
public void run() {
Thread.sleep(1000);
}
}
public class MyCallable implements Runnable{
@Override
public void run() {
Thread.sleep(1000);
}
}
这个sleep方法会抛出异常,你需要用try catch 捕获啊,由于是实现的接口,方法签名不能变更,无法使用方法定义的,throw 关键字抛出异常
@Override的时候是不能改变父类方法的签名的,函数抛出异常是签名的一部分,父类方法没有抛出异常Override的方法就只能自己用try...catch处理异常
@Override 重载的方法是父类的方法就独立分开了。其中子类对应的异常需要自己捕获。处理
1.错误一:你好,你没有深刻的理解异常处理的throws关键字,这个关键字是抛异常,也就是说,他会把当前产生的异常抛给他的调用者,也就是说,这个关键字最终也要用try-catch处理,你可以用这个关键字不断把一层一层一层往上抛,直到main方法里面用try-catch处理。所以main方法后面你是不能加throws,你在这儿加这个关键字,你相当于把这个异常交给了JAVA虚拟机来处理,而加瓦虚拟机根本没法处理你这个异常,所以会报错。所以记住main方法,不能用throws这个关键词处理异常,它里面必须用try-catch。
2.错误二:同时,要注意你重写的多线程的run方法并未用throws关键字处理异常哇,你把异常抛给他,他源码也无try-catch处理,本身就错误了嘛,所以这种重写的方法,他父类被重写的方法么有用throws处理,那么你重写他就必须try-catch处理异常。
好好理解一下java异常处理,基础不牢固。
有帮助的话记得采纳一下哦!
sleep方法会抛出异常,你需要用try catch 捕获或者throw
不知道你这个问题是否已经解决, 如果还没有解决的话: