黑马程序员技术交流社区
标题:
真心求教 是真迷糊----抛异常问题
[打印本页]
作者:
王红霞
时间:
2012-7-12 18:10
标题:
真心求教 是真迷糊----抛异常问题
本帖最后由 王红霞 于 2012-7-17 01:04 编辑
在看毕老师的视频的时候想不通……
class LpException extends Exception
{
LpException(String message)
{
super(message);
}
}
class MyException extends Exception
{
MyException(String message)
{
super(message);
}
}
class Computer
{
private state=1;
public void run()
{
if(state==2)
throw new LpException("蓝屏了");
if(state==3)
throw new MyException("冒烟了");
System.out.println("run computer");
}
public void reset()
{
System.out.println("reset computer");
}
}
class Teacher
{
private String name;
private Computer cmpt;
Teacher(String name)
{
this.name=name;
cmpt=new Computer();
}
public void prelect() throws MyException
{
try
{
cmpt.run();
}
catch (LpException e)
{
cmpt.reset();
}
catch (MyException e)
{
throw e
;//
如果下个程序还是不能处理这个异常 假设一直将这个异常抛下去 会不会产生
死锁(对于最后那个接受异常的的程序来说)
?有没有什么规则规定了异常最多抛几个程序?如果产生了死锁感觉解决起来会很麻烦是不是?不懂
}
System.out.println("teach");
}
}
class ExceptionTest
{
public static void main(String[] args)
{
Teacher t=new Teacher("doc. bi");
t.prelect();
}
}
作者:
丁二跃
时间:
2012-7-12 18:14
本帖最后由 丁二跃 于 2012-7-12 18:27 编辑
怎么会产生死锁呢?
死锁的产生是由于竞争资源引起的。比方说现在有 A 但是还需要B 才能完成某件事,而只有完成任务才能 把 A释放了;而 你现在 有B 需要A才能完成任务……
这个时候我们两都完不成任务了:我保持A 资源而等待 B 资源,你保持B资源 而等待 A资源,这就造成了死锁。
你的这个异常 如果一直抛出去,是不会产生死锁的。抛出只是让给别的程序执行罢了……
异常的抛出你可以这样理解:上级分配的任务一级一级分配到我们手里,我们处理的时候会遇到一些问题,当我们无法处理这些问题,或者可以处理这些问题 我们可以把
问题抛给上一级,上一级也无法处理或者从他的角度处理后 可以继续往上一级抛出,这样一级级抛到最上级处……
对于java 程序,一个方法内产生的异常可以抛给他的调用者处理…………一级级抛到main 中,如果 main 方法不处理而继续抛出,那虚拟机就会代为处理了,把信息打印出来
作者:
游兴钟
时间:
2012-7-12 18:16
不会有你所担心的"死锁"问题 但调用者调用了一个有问题的方法 它就必须处理.处理方法可以有两种 一种就是写catch自己搞定 另一种就是把异常包装成与本单元有关系的新的异常往外抛
作者:
王红霞
时间:
2012-7-12 18:18
achilles 发表于 2012-7-12 18:16
不会有你所担心的"死锁"问题 但调用者调用了一个有问题的方法 它就必须处理.处理方法可以有两种 一种就是写 ...
我就是想问 如果就这样一直往下抛 会不会给最后那个使用的程序造成不能运行的情况?
作者:
王红霞
时间:
2012-7-12 18:22
我的问题很弱智吗?{:soso_e132:}帮忙的人挺少的……
作者:
曹恒业
时间:
2012-7-12 19:09
/
如果下个程序还是不能处理这个异常 假设一直将这个异常抛下去 会不会产生
死锁(对于最后那个接受异常的的程序来说)
?有没有什么规则规定了异常最多抛几个程序?如果产生了死锁感觉解决起来会很麻烦是不是?不懂
======================================================
关于抛出异常是否会产生死锁的问题,以前还真没想到过。
如果要解决楼主的疑问,那我们
首先要明白死锁的概念和发生条件,以及Java在遇到异常时是如何处理的
,才能知道Java程序中在抛出异常时是否会有死锁现象的发生。
首先看看
死锁的概念
。
所谓死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法继续执行下去
。
Java程序抛出异常有两种处理方法
。用try,catch捕获并处理,或者在抛出异常的方法后加注throws关键字并申明抛出的异常。从Java处理异常的方式可以发现,不存在相互争夺资源的情况,而死锁发生的一个必要条件是,要有两个或两个以上的进程去争夺有限的资源,这里可以理解为都去争夺异常,这显然在楼主给的示例代码中是不可能的。
那么,出现死锁只可能在多线程中出现,但即便同时有多个线程抛出了异常,他们抛出的异常也都会通过各自的try,catch解决或是通过throws抛出,是不可能产生死锁的。
所以,楼主多虑了。
以上是个人看法,如有问题,欢迎拍砖,希望大家都能有所收获
。
作者:
刘笑
时间:
2012-7-12 20:56
不会死锁的,异常会被一次次的抛出,如果所有的程序甚至main()都解决不了的话,jvm会处理的
作者:
陆强强
时间:
2012-7-12 22:00
最后抛给主函数,主函数再抛给虚拟机就结束了
作者:
张天天
时间:
2012-7-12 22:22
怎么会死锁呢?不会吧
异常也是对象,产生了异常也不过是生成了对象而已,
只不过,通常的对象是来帮助执行程序,而异常是用来处理
出现的问题,也是程序的一部分
你所说的死锁应该是内存溢出的情况吧,内存过度使用造成的
这与对象的生成似乎没有什么关系吧
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2