黑马程序员技术交流社区

标题: 真心求教 是真迷糊----抛异常问题 [打印本页]

作者: 王红霞    时间: 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