《Java语言入门》

下载本书

添加书签

Java语言入门- 第4部分


按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
笾谢指垂吹氖焙颍坏貌恢葱幸唬縞opy;清除代码。为了把异常处理控制传递给更高层的处理段,可以再一次对截获对象实?copy;throw操作。注要再次实throw异常的方法,throw语句执行完后,会终止执行。try{f。open();}catch(Exceptione){f。close();throwe;}定局语句finally(定局?copy;语句是用于保证无论在异常是否发生的情况下,某?copy;代码被执行。下例说明finally语句的用法:try{//做某?copy;动作;}finally{//此后清除;}和以下代码类似try{//做某?copy;动作}catch(Objecte){//此后清除;throwe;}}//此后清除;即使try块中包含return,break,continue,throw语句,finally语句也会被执行。例如:下面的代码”finally”总是被输出,而”aftertry”仅在a!=10时被输出。try{if(a==10){return;}}finally{print(”finallyn”);}print(”aftertryn”);运行时刻异常本节列出的清单是Java解释器引发的各种异常。当运行时刻发现各种错误,由解释器引发异常。ArithmeticException如果程序试图除0,或用0取模,会产生ArithmeticException(算术异常?copy;,其它算术操作不会产生异常。有关Java如何处理其它算术错误的信息,见”整数运算符”和”浮点运算符”两节。例如:下面的代码将会引发ArithmeticException异常:classArith{publicstaticvoidmain(Stringargs''){intj=0;j=j/j;}}NullPointerException当程序试图访问一个空对象中的变量或方法,或一个空数组中的元素时则引发NullPointerException(空指针异常?copy;。例如,访问长度为0的数组a'0'。有以下类声明,运行时会引发NullPointerException异常:classNull{publicstaticvoidmain(Stringargs''){Stringo=null;inta''=null;o。length();a'0'=0;}}有趣的是,如果我们引发一个空对象,也会产一NullPointerException异常。InpatibleClassChangeException当一个类的定义被改变,而引用该类的其它类没有被重新编译时,会产生这一异常。有四种类更改会导致运行时刻引发InpatibleClassChangException异常。*一个类中的变量声明由static变成非static,而其它访问该类这一变量的类没有被重新编译。*一个类中的变量声明由非static变成static,而其它访问该类这一变量的类没有被重新编译。*类中声明的某个域被删除,而其它访问该域的类没有被重新编译。*类中声明的某个方法被删除,而其它访问该方法的类没有被重新编译。
  ClassCastException如果试图把对象o强制成ClassC,而o既不是ClassC的实例,也不是ClassC子类的实例,这时便会产生ClassCastException。classClassCast{publicstaticvoidmain(Stringargs''){Objecto=newObject();Strings=(string)o;s。length();}}}NagativeArraySizeException如果一个数组的长度是负数,则会引发NagativeArraySizeException(数组负下标?copy;异常。例如下面类定义的代码在运行时引发这一异常:classNegArray{publicstaticvoidmain(Stringargs''){inta''=newint'…1';a'0'=0;}}
  OutOfMemoryException当系统无法再向应用程序提?copy;内存时,会引发OutOfMemoryException(内存溢出?copy;异常。这种异常只能出现在创建新对象的时候,即new被调用的时候。例如,下面一段代码在运行时刻会引发OutOfMemoryException异常:classLink{inta''=newint'1000000';Linkl;}ClassOutOfMem
{publicstaticvoidmain(Stringargs''){publicstaticvoidmain(Stringargs''){Linkroot=newlink();Linkcur=root;while(true){cur。l=newLink();cur=cur。l;}}}NoClassDefFoundException如果一个类被引用,但在运行时刻,系统没有找到被引用的类,这时会引发NoClassDefFoundException(未找到类定义?copy;异常。例如,NoClass
的声明如下:classNoClass{publicstaticvoidmain(Stringargs''){Cc=newC();}}当NoClass运行时,如果解释器找不到C类,则会产生NoClassDefFoundException。注意,在NoClass被编译时C类一定要存在。
  InpatibleTypeException如果试图为一界面作实例,则会引发InpatibleTypeException(类型不兼容?copy;异常。例如,下面的代码会引发一个InpatibleTypeException。InterfaceI{}classInpType{publicstaticvoidmain(Stringargs''){Ir=(I)new(”I”);}}ArrayIndexOutOfBoundsException试图访问数组中的一个非法元素时,会引发ArrayIndexOutOfBoundsException(数组索引越界?copy;异常。例如:ClassArrayOut{publicstaticvoidmain(Stringargs''){inta''=newint'0';a'0'=0;}}publicstaticvoidmain(Stringargs''){inta''=newint'0';a'0'=0;}}UnsatisfiedLinkException如果一个方法被声明为本机,但该方法在运行时刻却不能连接到一个例程体上去时,会产生UnsatisfiedLinkException(无法连接?copy;异常。例如:ClassNoLink{staticnativevoidfoo();publicstaticvoidmain(Stringargs''){foo();}}InternalExceptionInternalException(内部?copy;异常是不能被引发的。只有在运行失败作一致性检查时,才会引发这个异常。
本章小结
  1。Java语言的基本结构象C/C++。2。Java语言的源程序代码由一个或多个编译单元(pilationunit)组成。
第四章Java应用程序的基本框架
  学习一门新语言最好是先看几个简单的程序例子。下面我们将看到几个非常基本的程序例子。
4。1Java应用程序的运行环境
  Java应用程序是指可以独立运行在Java虚拟机上的程序,它是一种中间代码(byte…code?copy;。比如你的应用程序叫my。java,程序里有一个名称为app1的类,用Javac或其它编译器,编译后将会生成app1。class,则在命令行状态下输入:javaapp1就可以运行此程序。注意,用java命令运行的类必须有main函数,否则不能执行。与普通java应用程序不同的另一种另一种Java程序叫JavaApplet。我们把它译成Java小程序,这种程序后缀也是。class,但它不能直接在java虚拟机上运行,也就是输入java*。class不能运行,这种程序里可以没有main函数,它必须由某个浏览器来运行,比如Appletviewer或Netscape2。02以上等。这种程序我们将在后面章节中介绍。
4。2最简单的Java程序解释
  让我们来看一看最简单的Java应用程序例子,来理解一下它的结构:Filename:1。javaclassmyfirst{publicstaticvoidmain(Stringargs''){System。out;println(”ThisismyfirstJavaApplication”);}}这就是一个完整的Java应用程序,将它编译:Javac1。java在当前目录下,它将生成myfirst。class文件,Javamyfirst屏幕上将会输出:ThisismyfirstJavaApplication让我们来一步一步分析每句话含义(1?copy;classmyfirst这一行用关键词class来定义名为myfirst的新类,myfirst是新类的名称,必须是一个有效的标识符,有效标识符定义请见程序设计基础章节。类的说明包括数据说明和成员函数说明,都放在类后面的大括号里面。一般类定义如下:class类名称{数据定义;函数定义;}
  (2)publicstaticvoidmain(Stringargs'')public是一个表示访问权限的关键字,表示此成员函数是公有的,可以被其他类直接调用,包括java解释器。相对应的关键字有private和protected,friend。private表示只能被本类访问,protected表示只能被子类访问,friend是缺省的访问权限,表示能被本包(package)中任意类访问,对其它包中的类是不可访问的。
  static表示main成员函数在myfirst类的所有对象中是唯一的,因此如果本程序生成另一个myfirst类对象,调用的main函数将是同一个函数。void表示main函数没有返回值,如果有返回类型值,则可加上interger或boolean诸如此类,对于有返回值的函数,其函数实体的最后应加上return语句。main这个函数是这运行应用程序的入口点,因此编写应用程序是必须有main()函数,且是唯一的。(3?copy;System。out。println一句这一句是main函数里的功能语句,是调用Java里System包里的out类的println成员函数,是标准输入输出。
4。3Java应用程序参数的传递
  Java语言很类似C和C++语言。在C语言里,通过在命令行输入参数,C程序可由main函数读入这?copy;参数,java程序也一样,请看下面程序:Filename:2。javaclassMy2{publicstaticvoidmain(Stringargs''){intarc=args。length;if(arc》0){for(inti=0;i){m=newMemo(args'0');}else{m=newMemo();}m。start();}}将Frame联系起来l熟悉的函数paint()和mouseDown(),看起来有点眼熟。这?copy;函数与applet的函数一样。实际上,一个frame包含各种GUI组件与applet的形式一样。另一个熟悉的函数是start()。这个函数并不必要,因为我们没有覆盖任何已存在的函数。但你想继承applet编程的风格,你还是可以使用start();stop();init()与destroy()等函数。l新函数我们熟悉的函数start()调用了show()。show()函数是Window类的继承,它显示Fame及其所有组件。在mouseDown()函数里我们看到两个函数:hide()和dispose()。hide()只简单地使Frame不可见。你可以在任何时候调用它来隐藏窗口。dispose()函数释放由Frame占有的系统资源。只有在你不需要Frame时才调用它。
  l构造函数Memo例子还包含了一个新函数Memo()。其实这个类有两个Memo()函数!任何与类名相同的函数都是构造函数。它在创建一个新对象时被调用。你可以认为它是一个对象的init()初始化函数。为什么需要两个构造函数呢?有了两个构造函数,我们可以利用多态性的优点,有两种方法创建一个新Memo对象。我们可以简单的创建使用缺省信息的Memo对象:m=newMemo();或者,我们可以自己提?copy;信息:m=newMemo(”Ourmessage”);Frame控制本程序的最后功能是在main()里建立并显示frame。它由以下两步实现://Step1m=newMemo();//Step2m。start();第一步初始化memo对象。我们象操作其它对象一样操作m。为显示frame,我们需要调用show()。这在第二步里实现。另一个要注意的是程序的健壮性:我们基本的frame里没有包含处理标准WINDOW_DESTROY消息的函数。这样,你将不能在窗口的控制菜单里选中”Quit”或”Exit”。为了增加这个功能,你需要增加以下的处理程序:publicbooleanhandleEvent(Evente){if(e。id==Event。WINDOW_DESTROY){dispose();System。exit(1);returntrue;}else{//Goaheadanddowhatwenormallywouldhavedonereturnsuper。handleEvent(e);}}
  菜单图形界面依靠菜单来指导用户操作。设计独立的Java应用程序时,Java提?copy;创建和使用菜单的直接方法。象其它组件一样,new将创建一个菜单:MenuoptionMenu;optionsMenu=newMenu(”Options”);菜单项一?copy;你创建了一个菜单,你可以使用add()来组建菜单项:optionsMenu。add(newMenuItem(”Option1”);optionsMenu。add(newMenuItem(”Option2”);菜单事件当你选中某个菜单项时,你创建此菜单项的字符?reg;将在事件中返回。你可以象测试按钮选择一样测试菜单选择:publicbooleanaction(Evente;Objectarg){。。。if(e。targetinstanceofMenuItem){System。out。println((String)arg);}。。。}其它菜单项除了上面描述的简单菜单项外,你还可增加CheckBox菜单项,分割线,以及子菜单。下面是一?copy;例子:Menum;n;m=newMenu(”Examples”);m。add(newMenuItem(”Basic”));m。add(newMenuItem(”Simple”));
//addaseparatorm。add(newMenuItem(”…”));//addaCheckboxitemm。add(newCheckboxMenuItem(”Check”));//addasubmenun=newMenu(”MoreExamples”);n。add(newMenuItem(”SubBasic”));n。add(newMenuItem(”SubSimple”));m。add(n);菜单条你创建好菜单后,你应将?reg;放在应用程序的菜单条上:mb=newMenubar();mb。add(m);mb。add(optionsMenu);然后你可为applet设置菜单条:setMenuBar(mb);
4。5独立应用程序例子
  为了看一个更复杂的独立的图形界面应用程序,下面有一个数字转换的例子:importjava。awt。*;
publicclassd2xextendsFrame{intdecimalValue=0;StringbaseXValue
=newString(”0”);TextFielddDisplay;xDisplay;
//d2xconstructorpublicd2x(){super(”DecimalConverter”);//setthe
titleoftheframeMenuBarmb=newMenuBar();Buttond2Binary=new
Button(”Binary”);Buttond2Octal=newButton(”Octal”);Buttond2Hex=
newButton(”Hex”);Buttond2Base36=newButton(”Base36”);Panelp1=new
Panel();Panelp2=newPanel();Panelp3=newPanel();
//addasimplemenuMenum=newMenu(”Application”);m。add(new
CheckboxMenuItem(”Base36Active”);m。add(newMenuItem(”Exit”));
//addmenutomenubarmb。add(m);setMenuBar(mb);//installthismenubar
intheframe
//Addbuttonstotheirownpanelp3。setLayout(newFlowLayout());
p3。add(d2Binary);p3。add(d2Octal);p3。add(d2Hex);p3。add(d2Base36);
//AddtextfieldsLabeldLabel=newLabel(”EnterDeecimal:”);Label
xLabel=newLabel(”ConvertedValue:”);dDisplay=new
TextField(integer。toString(decimalValue);7);xDisplay=new
TextField(baseXValue;32);xDisplay。setEditable(false);
p1。setLayout(newFlowLayout(FlowLayout。LEFT));p2。setLayout(new
FlowLayout(FlowLayout。LEFT));p1。add(dLabel);p1。add(dDisplay);
p2。add(xLabel);p2。add(xDisplay);
//Addthepanelsadd(”North”;p1);add(”Center”;p2);
add(”South”;p3);}//endd2xconstructor
publicvoidstart(){resize(400;150);show();}
publicvoidupdateXDisplay(){xDisplay。setText(baseXValue);}
publicbooleanhandleEvent(Eventevt){if(evt。targtintanceofMenuItem)
{if(”Exit”。equals(((MenuItem)evt。target)。getLabel())){hide();
dispose();System。exit(0);returnfalse;}retruntrue;}elseif
(evt。targetinstanceofButton){Stringwhick=
((Button)evt。target)。getLabel();if(whick。equals(”Binary”))
{decimalValue=Integer。parseInt(dDisplay。getText());baseXValue=
Interger。toString(decimalValue;2);}if(whick。equals(”Octal”))
{decimalValue=Integer。parseInt(dDisplay。getText());baseXValue=
Interger。toString(decimalValue;8);}if(whick。equals(”Hex”))
{decimalValue=Integer。parseInt(dDisplay。getText());baseXValue=
Interger。toString(decimalValue;16);}if(whick。equa
小提示:按 回车 [Enter] 键 返回书目,按 ← 键 返回上一页, 按 → 键 进入下一页。 赞一下 添加书签加入书架