《Java语言入门》

下载本书

添加书签

Java语言入门- 第9部分


按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
soup。add(c);//printarecordofosraddition
System。out。println(”Added”+c+”tothesoup。”);//waitabitbeforewe
addthenextlettertry{sleep((int)(Math。random()*1000));}catch
(InterruptedExceptione){}}}}
注意我们创建了Soup类的一个实例。生产者用soup。add()函数来建立字符池。
7。3。3消费者
让我们看看消费者的程序:classConsumerextendsThread{privateSoupsoup;
publicConsumer(Soups){//keepourowncopyofthesharedobjectsoup
=s;}
publicvoidrun(){charc;//Eat10lettersfromthealphabetsoupfor
(intI=0;ijavaExc0java。lang。arithmeticException:/byzeroatExc0。main(Exc0。java:4)
8。4try与catch
通常我们希望自己来处理”异常”并继续运行。可以用try来指定一块预防所有”异常”的的程序。紧跟在try程序后面,应包含一个catch子句来指定你想要捕捉的”异常”的类型。例如,下面的例子是在前面的例子的基础上构造的,但它包含一个try程序块和一个catch子句。classexc1{publicstaticvoidmain(stringargs''){try{intd=0;inta=42/d;}catch(arithmeticexceptione){system。out。println(”divisionbyzero”);}}}
catch子句的目标是解决”异常”情况,把变量设到合理的状态,并象没有出错一样继续运行。如果一个子程序不处理某个”异常”,则返到上一级处理,直到最外一级。
8。5多个catch子句
在某情况下,同一段程序可能产生不止一种”异常”情况。你可以放置多个catch子句,其中每一种”异常”类型都将被检查,第一个与?reg;匹配的就会被执行。如果一个类和其子类都有的话,应把子类放在前面,否则将永远不会到达子类。下面是一个有两个catch子句的程序的例子。
classMultiCatch{publicstaticvoidmain(Stringargs''){try{inta
=args。length;System。out。println(”a=”+a);intb=42/a;intc''=
{1};c'42'=99;}catch(ArithmeticExceptione){System。out。println(”div
by0:”+e);}catch(ArrayIndexOutOfBoundsExceptione)
{system。out。println(”arrayindexoob:”+e);}}}
如果在程序运行时不跟参数,将会引起一个0做除数的”异常”,因为a的值为0。如果我们提?copy;一个命令行参数,将不会产生这个”异常”,因为a的值大于0。但会引起一个ArrayIndexOutOfBoundexception的”异常”,因为整型数组c的长度是1,却给c'42'赋值。下面是以上两种情况的运行结果。
C:》javaMultiCatcha=0divby0:java。lang。arithmeticexception:/by
zeroC:》javaMutiCatch1a=1arrayindexoob:
java。lang。ArrayIndexOutOfBoundsException:42
8。6try语句的嵌套
你可以在一个成员函数调用的外面写一个try语句,在这个成员函数内部,写另一个try语句保护其他代码。每当遇到一个try语句,”异常”的框架就放到堆栈上面,直到所有的try语句都完成。如果下一级的try语句没有对某种”异常”进行处理,堆栈就会展开,直到遇到有处理这种”异常”的try语句。下面是一个try语句嵌套的例子。
classMultiNest{staticvoidprocedure(){try{intc''={1}:c'42'
=99;}catch(ArrayIndexOutOfBoundsexceptione)
{System。out。println(”arrayindexoob:”+e);}}publicstaticvoid
main(Stringargs''){try{inta=args。length;system。out。println(”a
=”+a);intb=42/a;procedure();}catch(arithmeticExceptione)
{System。out。println(”divby0:”+e);}}}
成员函数procedure里有自己的try/catch控制,所以main不用去处理ArrayIndexOutOfBoundsException。
8。7throw语句
throw语句用来明确地抛出一个”异常”。首先,你必须得到一个Throwable的实例的控制柄,通过参数传到catch子句,或者用new操作符来创建一个。下面是throw语句的通常形式。
throwThrowableInstance;
程序会在throw语句后立即终止,它后面的语句执行不到,然后在包含它的所有try块中从里向外寻找含有与其匹配的catch子句的try块。下面是一个含有throw语句的例子。
classThrowDemo{staticvoiddemoproc(){try{thrownewNullPointerException(”de3mo”);}catch(NullPointerExceptione){System。out。println(”caughtinsidedemoproc”);throwe;}}publicstaticvoidmain(Stringargs''){try{demoproc();}
catch(NullPointerExceptione){system。out。println(”recaught:”+e);}}}
8。8throws语句
throws用来标明一个成员函数可能抛出的各种”异常”。对大多数Exception子类来说,Java编译器会强迫你声明在一个成员函数中抛出的”异常”的类型。如果”异常”的类型是Error或RuntimeException,或它们的子类,这个规则不起作用,因为这?copy;在程序的正常部分中是不期待出现的。如果你想明确地抛出一个RuntimeException,你必须用throws语句来声明它的类型。这就重新定义了成员函数
的定义语法:typemethod…name(arg…list)throwsexception…list{}
下面是一段程序,它抛出了一个”异常”,但既没有捕捉它,也没有用throws来声明。这在编译时将不会通过。
classThrowsDemo1{staticvoidprocedure()'System。out。println(”inside
procedure”);thrownewIllegalAccessException(”demo”);}publicstatic
voidmain(Stringargs''){procedure();}}
为了让这个例子编译过去,我们需要声明成员函数procedure抛出了IllegalAccessException,并且在调用它的成员函数main里捕捉它。下面是正确的例子:
classThrowsDemo{staticvoidprocedure()throwsIllegalAccessException
{System。out。println(”insideprocedure”);thrownew
IllegalAccessException(”demo”);}publicstaticvoidmain(Stringargs'')
{try{procedure();}catch(IllegalAccessExceptione)
{System。out。println(”caught”+e);}}}
下面是输出结果:
C:》javaThrowsDemoinsideprocedurecaught
java。lang。IllegalAccessException:demo
8。9fi

小提示:按 回车 [Enter] 键 返回书目,按 ← 键 返回上一页, 按 → 键 进入下一页。 赞一下 添加书签加入书架