黑马程序员技术交流社区

标题: 学多线程的时候异常处理语句不懂 [打印本页]

作者: ぺsimon☆    时间: 2013-4-21 13:54
标题: 学多线程的时候异常处理语句不懂
本帖最后由 ぺsimon☆ 于 2013-4-21 13:57 编辑
  1. /*
  2. 需求:储户到银行存款,一次存100元,存三次
  3. 因为有很多用户同时存钱,多线程处理
  4. */

  5. class Bank //定义一个银行类
  6. {
  7.         private int sum,; //定义成员变量sum
  8.         public synchronized void add(int n)//把函数加锁,避免多线程调用
  9.         {
  10.         sum=sum+n;
  11.         try{Thread.sleep(20);}catch(Exception e){} //让线程睡一会儿
  12.         System.out.println(sum);  //输出sum
  13.         }
  14. }

  15. class Cus implements Runnable  //定义一个储户类并实现Runnable类
  16. {
  17.         Bank b=new Bank(); //创建一个银行
  18.         public void run()  //复写run方法
  19.         {
  20.         for(int x=0;x<3;x++) //存户一次存一百存了三次
  21.         {
  22.         b.add(100);  //调用add方法
  23.         }
  24.         }
  25. }

  26. class BankDemo
  27. {
  28.         public static void main(String[] args)
  29.         {
  30.         Cus c=new Cus();  
  31.         Thread t1=new Thread(c);
  32.         Thread t2=new Thread(c);
  33.         Thread t3=new Thread(c);
  34.         Thread t4=new Thread(c);
  35.         t1.start();
  36.         t2.start();
  37.         t3.start();
  38.         t4.start();
  39.         }
  40. }
复制代码
问题1:以下的语句中,为什么catch里面没有写处理语句,程序不会出错呢?不是try了就要处理吗?谢谢
try{Thread.sleep(20);}catch(Exception e){} //让线程睡一会儿

问题2:储户类中,Bank b=new Bank();
改为private Bank  b;
b=new Bank();为什么会报错呢?



作者: 晓风妮子    时间: 2013-4-21 14:05
本帖最后由 晓风妮子 于 2013-4-21 14:41 编辑

try里面是可能引起异常报错的代码,抛出的异常封装成类抛给catch,catch抓到这个异常以后,异常就处理完成了。
如果你想看这个异常是什么可以在catch语句中加入e.toString();或者e.printStackTrace();,前提是这个异常出现了。
如果你将代码改为如下就会看到效果。
/*

需求:储户到银行存款,一次存100元,存三次

因为有很多用户同时存钱,多线程处理

*/


class Bank //定义一个银行类

{

        private int sum; //定义成员变量sum

        public synchronized void add(int n)//把函数加锁,避免多线程调用

        {

        sum=sum+n;

        try{Thread.sleep(-10);}catch(Exception e){System.out.println(e.toString());} //让线程睡一会儿

        System.out.println(sum);  //输出sum

        }

}


class Cus implements Runnable  //定义一个储户类并实现Runnable类

{

        Bank b=new Bank(); //创建一个银行

        public void run()  //复写run方法

        {
        for(int x=0;x<3;x++) //存户一次存一百存了三次

        {

        b.add(100);  //调用add方法

        }

        }

}


public class BankDemo

{

        public static void main(String[] args)

        {

        Cus c=new Cus();  

        Thread t1=new Thread(c);

        Thread t2=new Thread(c);

        Thread t3=new Thread(c);

        Thread t4=new Thread(c);

        t1.start();

        t2.start();

        t3.start();

        t4.start();

        }
第二个问题,成员变量不可以这样定义可以将代码改为:
class Cus implements Runnable  //定义一个储户类并实现Runnable类

{
        private Bank b;
        //b=new Bank(); //创建一个银行

        public void run()  //复写run方法

        {
         b= new Bank();
        for(int x=0;x<3;x++) //存户一次存一百存了三次

        {

        b.add(100);  //调用add方法

        }

        }

}

}

作者: 殇_心。    时间: 2013-4-21 14:17
本帖最后由 殇_心。 于 2013-4-21 14:40 编辑

问题一:
你try之后,catch了,如果出现异常,说明你也处理了。只是处理方式为空,没有任何含义。

问题二:
试了一下,代码如下:
private Bank  b;
{                           
b=new Bank(); //放入构造代码块
}
你的代码:
定义在方法外面是成员变量。
private Bank  b;//成员变量
b=new Bank(); //成员变量
所以报错了。
作者: lipingan0520    时间: 2013-4-21 14:18
try没出问题,就不会执行catch块里面的内容了,至于cathc里没写内容也没事,虚拟机会做默认的处理的。

改为private Bank  b;
b=new Bank();为什么会报错呢?
你可以使用当前构造方法初始化,给b赋值也可以。

private int sum,; //定义成员变量sum,sum后面多了一个逗号哦。

作者: 黄玉昆    时间: 2013-4-21 21:57
如果问题未解决,请继续追问,如果问题解决了,请将问题分类改为“已解决”,谢谢
作者: ぺsimon☆    时间: 2013-4-21 23:38
lipingan0520 发表于 2013-4-21 14:18
try没出问题,就不会执行catch块里面的内容了,至于cathc里没写内容也没事,虚拟机会做默认的处理的。

改 ...

一个类里面的成员变量,不是在局部里面也可以使用吗?
你的意思你程序改成这样就可以吗?把b=new Bank();这句变成成员变量吗?
private Bank b;
b=new Bank();
public void run()
{}
作者: ぺsimon☆    时间: 2013-4-25 01:39
殇_心。 发表于 2013-4-21 14:17
问题一:
你try之后,catch了,如果出现异常,说明你也处理了。只是处理方式为空,没有任何含义。

您好,为什么我这样写不可以
class Cus implements Runnable  //定义一个储户类并实现Runnable类
{
        Bank b;
        b=new Bank(); //创建一个银行
        public void run()  //复写run方法
        {
        }
}

我这样写就行呢?谢谢
class Cus implements Runnable  //定义一个储户类并实现Runnable类
{
        Bank b;
       
        public void run()  //复写run方法
        {
      b=new Bank(); //创建一个银行
        }
}
作者: 殇_心。    时间: 2013-4-25 10:17
ぺsimon☆ 发表于 2013-4-25 01:39
您好,为什么我这样写不可以
class Cus implements Runnable  //定义一个储户类并实现Runnable类
{

        Bank b;//成员变量,这个没问题
         b=new Bank(); //成员变量,这个就有问题是吧? 系统会认为这个没有定义类型 懂了么?
         public void run()  //复写run方法
         {
        }
作者: ぺsimon☆    时间: 2013-4-25 14:12
殇_心。 发表于 2013-4-25 10:17
Bank b;//成员变量,这个没问题
         b=new Bank(); //成员变量,这个就有问题是吧? 系统会 ...

不是很懂,我把b=new BanK()放到函数里,没有出错
但是直接放到成员变量那里就有问题
           Bank b;
          public void run()  //复写run方法
        {
      b=new Bank(); //创建一个银行      
                       //我把b=new BanK()放到函数里放到这里就没报错,函数里的b不是也没有定义类型吗,但放到成员位置就出错,为什么呢?
        }
作者: 殇_心。    时间: 2013-4-25 16:03
ぺsimon☆ 发表于 2013-4-25 14:12
不是很懂,我把b=new BanK()放到函数里,没有出错
但是直接放到成员变量那里就有问题
           Bank b;

你放在函数内,叫执行代码。
跟放在成员位置是有很大区别的。
现在
b = new Back();放在成员位置上
系统会认为这里的b是没有定义类型的。。?  可懂我意思了?
作者: ぺsimon☆    时间: 2013-4-25 19:45
殇_心。 发表于 2013-4-25 16:03
你放在函数内,叫执行代码。
跟放在成员位置是有很大区别的。
现在

那成员上不是已经:private Bank b了吗,为什么说没定义呢?
作者: 殇_心。    时间: 2013-4-25 21:00
ぺsimon☆ 发表于 2013-4-25 19:45
那成员上不是已经:private Bank b了吗,为什么说没定义呢?

系统会把每一个语句都看作是成员变量。。  懂了吗?




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2