Java语言入门-第12章
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
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。9finally
当一个”异常”被抛出时,程序的执行就不再是线性的,跳过某?copy;行,甚至会由于没有与?reg;匹配的catch子句而过早地返回。有时确保一段代码不管发生什么”异常”都被执行到是必要的,关键词finally就是用来标识这样一段代码的。即使你没有catch子句,finally程序块也会在执行try程序块后的程序?reg;前执行。每个try语句都需要至少一个与?reg;相配的catch子句或finally子句。一个成员函数返回到调用它的成员函数,或者通过一个没捕捉到的”异常”,或者通过一个明确的return语句,finally子句总是恰好在成员函数返回前执行。下面是一个例子,它有几个成员函数,每个成员函数用不同的途径退出,但执行了finally子句。
classFinallyDemo{staticvoidprocA(){try
{System。out。println(”insideprocA”);thrownew
RuntimeException(”demo”);}finally{System。out。println(”procA's
finally”);}}staticvoidprocB(){try{System。out。println(”inside
procB”);return;}finally{System。out。println(”procB'sfinally”);}}
publicstaticvoidmain(Stringargs''){try{procA();}catch(Exception
e);procB();}}
下面是这个例子的运行结果:
C:》javaFinallyDemoinsideprocAprocA'sfinallyinsideprocBprocB'sfinally
本章小结
1。”异常”指的是程序运行时出现的非正常情况。2。在”异常”类层次的最上层的类叫Throwable,它有两个直接的子类:Exception和Error。3。Java的”异常”处理通过5个关键词来实现:try,catch,throw,throws和finally。
第九章Java输入输出操作
9。1Java输入输出流
所有的程序语言都提?copy;与本机文件系统交互的方式;Java也不例外。我们将看看Java是怎样处理标准文件输入输出的(包括stdin;stout;stderr)。当你在网络上开发小程序时,你必须注意直接文件输入输出是不安全因素的关键。大多数用户设置他们的浏览器,可让你自由的访问他们的文件系统,但有?copy;不让你访问。当然,如果你开发你内部的应用程序,你也许需要直接访问文件。标准输入输出Unix的用户,或其他基于命令行系统的用户(如DOS),都知道标准输入输出的含义。标准输入文件是键盘,标准输出文件是你的终端屏幕。标准错误输出文件也指向屏幕,如果有必要,它也可以指向另一个文件以便和正常输出区分。
系统类Java通过系统类达到访问标准输入输出的功能。上面提到的三个文件在这个系统类中实现:StdinSystem。in作为InputStream类的一个实例来实现stdin,你可以使用read()和skip(longn)两个成员函数。read()让你从输入中读一个字节,skip(longn)让你在输入中跳过n个字节。
StoutSystem。out作为PrintStream来实现stdout,你可以使用print()和println()两个成员函数。这两个函数支持Java的任意基本类型作为参数。
StderrSystem。err同stdout一样实现stderr。象System。out一样,你可以访问PrintStream成员函数。
9。2标准输入输出例子
这里有一个例子,功能象Unix里的cat或type:importjava。io。*classmyCat{publicvoidmain(Stringargs'')throwsIOException{intb;intcount=0;while((b=System。in。read())!=
…1){count++;System。out。print((char)b);}System。out。println();
//blanklineSystem。err。println(”counted”+count+”totalbytes。”);}}
9。3普通输入输出类
除了基本的键盘输入和屏幕输出外,我们还需要联系文件的输入输出。我们将学习下面几个类:lFileInputStreamlDataInputStreamlFileOutputStreamlDataOutputStream
作为参考,再列出一?copy;特定应用的类:lPipedInputStreamlBufferedInputStreamlPushBackInputStreamlStreamTokenizerlPipedOutputStreamlBufferedOutputStreamlRandomAccessFile
我们不在此讨论这?copy;类,但你可以在JAVA_HOME/src/java/io目录里查看每个类的成员函数定义。
9。4文件
在我们进行文件操作时,需要知道关于文件的信息。File类提?copy;了一?copy;成员函数来操纵文件和获得文件的信息。
9。4。1创建一个新的文件对象
你可用下面三个方法来创建一个新文件对象:FilemyFile;myFile=newFile(”etc/motd”);或myFile=newFile(”/etc”;”motd”);//moreusefulifthedirectoryorfilenamearevariables或FilemyDir=newfile(”/etc”);myFile=newFile(myDir;”motd”);
这三种方法取决于你访问文件的方式。例如,如果你在应用程序里只用一个文件,第一种创建文件的结构是最容易的。但如果你在同一目录里打开数个文件,则第二种或第三种结构更好。
9。4。2文件测试和使用
一但你创建了一个文件对象,你便可以使用以下成员函数来获得文件相关信息:文件名lStringgetName()lStringgetPath()lStringgetAbslutePath()lStringgetParent()lbooleanrenameTo(FilenewName)文件测试lbooleanexists()lbooleancanWrite()lbooleancanRead()lbooleanisFile()lbooleanisDirectory()lbooleanisAbsolute()一般文件信息llonglastModified()llonglength()目录用法lbooleanmkdir()lString''list()
9。4。3文件信息获取例子程序
这里是一个独立的显示文件的基本信息的程序,文件通过命令行参数传输:
importjava。io。*;classfileInfo{FilefileToCheck;publicstaticvoidmain(Stringargs'')throwsIOException{if(args。length》0){for(inti=0;i
end