前言:

我们继续接着前面的内容来继续学习


高级GUI组件设计

Java采用委托事件模型来处理事件。当事件产生时,通过注册的监听器对象的Listener接口的事件处理方法来进行处理。然而,当一个Listener接口有多个处理方法(例如:鼠标事件有按下鼠标按钮、释放鼠标按键、单机鼠标按键)时,则不管是否需要,必须实现所有方法,这样下去会造成资源的浪费,并使系统开销加大。为了解决此类问题,Java语言为这些Listener接口提供了适配器类(Adapter),事件适配器(EventAdapter)为我们提供了一种简单的处理手段。当事件源注册了含有多个处理方法的监听器对象时,可以通过继承事件所对应的Adapter类,重写所需要的方法,而不需要的方法则不用重写,这样就可以缩短程序代码的编写。

KeyEvent事件及其响应:

KeyEvent事件

能触发KeyEvent事件的动作是键盘操作,所以简称为键盘操作。KeyEvent事件有三种:两个低级事件(按下(Pressed)和释放键(Released))和一个高级事件(键按下并释放(按键被敲击,Typed))。

键盘事件的响应

package 测试;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class test extends JApplet
{String s,s1;JLabel lb1=new JLabel("请按键盘");JLabel lb2=new JLabel("复制结果");//用来输入文字JTextField tf1=new JTextField(10);//用来显示文件内容JTextArea tf2=new JTextArea(5,10);Container cp=getContentPane();FlowLayout flow=new FlowLayout(FlowLayout.CENTER,5,5);public void init(){cp.setLayout(flow);cp.add(lb1);cp.add(tf1);cp.add(lb2);cp.add(tf2);tf1.addKeyListener(new koLis());}//继承了一个事件适配器的类,对应的监听器是KeyListener//这里是一个Java嵌套类class koLis extends KeyAdapter{//只要有键入就会触发public void keyTyped(KeyEvent e){//获取文本框的内容及键入的字符s=tf1.getText()+e.getKeyChar();//若按回车键,则将文本框的内容送入文本域if(e.getKeyChar()=='\n'){//文本域中已经有的文字再加上新的s1=tf2.getText()+s;tf1.setText("");tf2.setText(s1);}}}
}

MouseEvent事件及其响应

MouseEvent事件是低级事件,在任何组件上都可以触发该事件。组件上触发MouseEvent事件的动作是鼠标操作。MouseEvent事件分为两类:

  • 使用MouseListener接口处理的鼠标事件。awt.Event类的MouseListener接口能够监听的5种鼠标事件是:按下鼠标按键、释放鼠标按键、单机鼠标按键(按下并释放)、鼠标光标进入或离开组件几何形状的未遮掩部分
  • 使用MouseMotionListener接口处理的鼠标移动事件。awt.Event类的MouseMotionListener接口能够监听的两种鼠标移动的事件是:移动鼠标和拖动鼠标事件
package 测试;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class test extends JApplet
{int x,y;JLabel lb1=new JLabel("X:"),lb2=new JLabel("Y:"),lb3=new JLabel("");JTextField tf1=new JTextField(5),tf2=new JTextField(5);Container cp=getContentPane();FlowLayout flow=new FlowLayout(FlowLayout.CENTER,5,5);public void init(){cp.setLayout(flow);cp.add(lb1);cp.add(tf1);cp.add(lb2);cp.add(tf2);cp.add(lb3);addMouseListener(new mouseListener());addMouseMotionListener(new koLis());}//此适配器类监听鼠标各种信息情况class mouseListener extends MouseAdapter{public void mouseClicked(MouseEvent e){ lb3.setText("点击鼠标");}public void mousePressed(MouseEvent e){lb3.setText("鼠标按钮按下");}public void mouseExited(MouseEvent e){lb3.setText("鼠标不在窗口");}public void mouseReleased(MouseEvent e){lb3.setText("鼠标按钮松开");}}//此监听器监听移动情况class koLis implements MouseMotionListener{public void mouseMoved(MouseEvent e){x=e.getX();y=e.getY();tf1.setText(String.valueOf(x));tf2.setText(String.valueOf(y));}public void mouseDragged(MouseEvent e){lb3.setText("拖动鼠标");}}
}

WindowsEvent事件及其响应

在JFrame容器上,如果用户打开或关闭容器,则可以触发WindowEvent事件。 WindwoEvent事件是低级事件,可以设计打开、关闭、激活、停用、图标化或取消图标化JFrame容器的操作来产生WindowEvent事件。

package 测试;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class test
{JLabel lb1=new JLabel("这是第一个窗口");JLabel lb2=new JLabel("这是第二个窗口");public static void main(String [] arg){test t=new test();}public test(){//创建JFrame对象JFrame f1=new JFrame();JFrame f2=new JFrame();//创建JFrame的容器对象,获得ContentPaneContainer cp=f1.getContentPane();Container cp1=f2.getContentPane();f1.setTitle("JFrame1");f2.setTitle("JFrame2");f1.setSize(150,100);f2.setSize(150,100);cp.add(lb1);//设置窗口可见f1.setVisible(true);cp1.add(lb2);f2.setVisible(true);f1.addWindowListener(new WinLis());f2.addWindowListener(new WinLis());        }//Window事件适配器class WinLis extends WindowAdapter{//打开窗口public void windowOpen(WindowEvent e){}//设置窗口成为活动窗口public void windowActivated(WindowEvent e){}//设置窗口成为非活动窗口public void windowDeactivated(WindowEvent e){}//窗口关闭public void windowClosing(WindowEvent e){System.exit(0);}//最小化窗口public void windowIconified(WindowEvent e){}}
}

JScrollPane与JScrollBar组件:

JScollPane:

当窗口的内容大于窗口时,可以在窗口的右边和下边设置滚动条,借助于滚动条就可以看到整个窗口的内容。JScrollPane就是具有这种功能的组件,我们将它成为滚动窗面板,用于滚动窗口。

JScrollBar组件:

JScrollPane是由JViewPort和JScrollBar组件组成的。JViewPort组件主要是负责显示内容的区域大小;JScrollBar组件则产生窗口滚动条,让用户看到整个内容。用户使用JScrollPane组件时不会直接与JViewPort和JScrollBar组件接触,使用比较方便。但是,当想对滚动条做更细的设置时(例如,在拖动时一次滚动多少区域等),就必须了解JScrollBar所提供的功能。

AdjustmentEvent事件应用举例:

JScrollBar对象接收AdjustmentEvent事件。

示例:

package 测试;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class test
{int r=0,g=0,b=0;String s,s1=" ",s2=" ",s3=" ";//声明建立滚动条的变量JScrollBar sbr,sbg,sbb;JLabel lb1=new JLabel("刻度:"),lb2=new JLabel(" 标签:"),lb3=new JLabel("  调色板  "),lbr=new JLabel("红色"),lbg=new JLabel("绿色"),lbb=new JLabel("蓝色");public test(){JFrame f=new JFrame("JScrollBar");Container cp=f.getContentPane();Box baseBox=Box.createHorizontalBox();cp.add(baseBox);//创建box1Box box1=Box.createHorizontalBox();//给box1加两个标签box1.add(lb1); box1.add(lb2);//加box1加到baseBox中baseBox.add(box1);//创建box3Box box3=Box.createVerticalBox();//将box3加入到baseBox中baseBox.add(box3);//设置标签颜色lb3.setBackground(new Color(0,0,0));//设置标签边框lb3.setBorder(BorderFactory.createEtchedBorder());//让组件变得不透明,使标签颜色显示出来lb3.setOpaque(true);lb3.setMaximumSize(new Dimension(450,200));box3.add(lb3);//sbr滚动条的设置//创建水平方向滚动条对象sbr=new JScrollBar(JScrollBar.HORIZONTAL,10,10,0,260);//设置此滚动条拖动滚动块时的单位向量sbr.setUnitIncrement(5);//设置鼠标在滚动条上点击时滚动块的块增量sbr.setBlockIncrement(10);//注册监听器对象sbr.addAdjustmentListener(new Dj());//给box3添加滚动条和对应标签box3.add(lbr);box3.add(sbr);//sbg滚动条的设置sbg=new JScrollBar(JScrollBar.HORIZONTAL,10,10,0,260);sbg.setUnitIncrement(5);sbg.setBlockIncrement(10);sbg.addAdjustmentListener(new Dj());box3.add(lbg);box3.add(sbg);//sbb滚动条的设置sbb=new JScrollBar(JScrollBar.HORIZONTAL,10,10,0,260);sbb.setUnitIncrement(5);sbb.setBlockIncrement(10);sbb.addAdjustmentListener(new Dj());box3.add(lbb);box3.add(sbb);f.pack();f.setVisible(true);f.addWindowListener(new WinLis());}class WinLis extends WindowAdapter{public void windowClosing(WindowEvent e) {System.exit(0);}}class Dj implements AdjustmentListener{@Overridepublic void adjustmentValueChanged(AdjustmentEvent e) {if((JScrollBar)e.getSource()==sbr){r=e.getValue();s1="red";}if((JScrollBar)e.getSource()==sbg){g=e.getValue();s2="green";}if((JScrollBar)e.getSource()==sbb){b=e.getValue();s3="blue";}s=s1+r+" "+s2+g+" "+s3+b;lb2.setText(s);lb3.setBackground(new Color(r,g,b));}}public static void main(String[] arg){test t=new test();}
}

JTabbedPane容器:

当界面上需要放置的组件很多时,可以使用的另一个容器是JTabbedPane。JTabbedPane容器与我们日常使用的卡片盒相似,它由多个称为标签框架的卡片和表明该框架的标签组成。每个标签框架和标签都自成一个系统(也可以称为一张卡片),我们可以在标签框架中加入各式各样的组件和功能。由于这些卡片被叠放在一起,为了使用方便,卡片上的标签在顶行或底部排成一行(也可以在左边或右边排成一列),当用鼠标点击某一个标签时,这个标签所在的卡片(标签框窗口)就会被翻到最上面,显示出此框架的内容

示例:

package 测试;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class test extends JFrame
{//创建JTabblePane对象,并指定标签显示在上方JTabbedPane jtab=new JTabbedPane(JTabbedPane.TOP);//声明JScrollPane的引用变量JScrollPane sp;public static void main(String args[]){test f=new test();f.setTitle("JTabbedPane对象的应用");f.setSize(300,300);f.setVisible(true);}public test(){//声明标签的数组JLabel lb[]=new JLabel[6];//声明图片对象的引用变量Icon pic;//声明标签名称对象的引用变量String title;String p;for(int i=1;i<=5;i++){p="/image/"+"00"+i+".jpg";//获取图片pic=new ImageIcon(getClass().getResource(p));//创建JLabel对象lb[i]=new JLabel();//设定JLabel图标lb[i].setIcon(pic);//设定标签名称title="第 "+String.valueOf(i)+" 页";//将JLabel对象加入jtab的对象中jtab.add(title,lb[i]);}//将jtab对象加入到窗口中getContentPane().add(jtab);int v=ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED;int h=ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED;//创建JScrollPane对象,并加载jtab对象sp=new JScrollPane(jtab,v,h);getContentPane().add(sp);//注册监听器addWindowListener(new WinLis());}class WinLis extends WindowAdapter{public void windowClosing(WindowEvent e){System.exit(0);}}
}

菜单设计:

菜单和工具可提供简单明了的指示说明,使用户顺利地完成软件的操作。菜单是非常重要的GUI组件,是软件中必备的组件之一,Java语言提供了多种多样的菜单,如一般式、复选框式、快捷键式及弹出框式等,这里仅介绍一般式菜单。

在Java中一个一般式菜单由菜单栏(JMenuBar)、菜单(JMenu)和菜单项(JMenuItem)三类对象组成。

菜单栏

菜单栏(JMenuBar)用来封装与菜单相关的各项操作,它只是用来管理菜单,不参与交互式操作。Java应用程序中的菜单都包含在一个菜单栏对象之中,

菜单

菜单(JMenu)是用来存放和整合菜单项(JMenuItem)的组件,它是构成一个菜单栏不可或缺的组件之一。菜单可以是单一层次的结构,也可以是一个多层次的结构,具体使用何种形式的结构取决于界面设计的需要。

菜单项

菜单项(JMenuItem)是用来封装与菜单项相关的操作,它是菜单系统中最基本的组件。

接下来我们来看个制作菜单的示例:

package 测试;
import javax.swing.*;import java.awt.BorderLayout;
import java.awt.event.*;
public class test extends JFrame
{JTextArea tf=new JTextArea();//创建JMenuBar对象JMenuBar bar=new JMenuBar();//创建JMenu对象JMenu menu=new JMenu("文件");//创建JMenuItem对象JMenuItem newf=new JMenuItem("新建");JMenuItem open=new JMenuItem("打开");JMenuItem close=new JMenuItem("关闭");JMenuItem quit=new JMenuItem("退出");public test(){//设定JFrame的标签//这里是手动给父类的构造函数传了个参数//一般子类创建对象都会调用父类的无参构造函数super("test");//创建JFrame的容器对象getContentPane().add(new JScrollPane(tf));//设置文本区域为不可编辑tf.setEditable(false);//设置bar为不透明,若设置bar为透明,则在选择菜单时会有残影存留在JMenuBar上bar.setOpaque(true);//加入bar到JFrame上setJMenuBar(bar);//加入JMenuItem对象到menu上menu.add(newf);menu.add(open);menu.add(close);//在JMenu中加入一条分割线menu.addSeparator();menu.add(quit);//将menu加载到bar上bar.add(menu);//注册监听器newf.addActionListener(new Ac());open.addActionListener(new Ac());close.addActionListener(new Ac());quit.addActionListener(new Ac());addWindowListener(new WinLis());}class Ac implements ActionListener{public void actionPerformed(ActionEvent e){if(e.getSource()==newf)  tf.setText("新建");if(e.getSource()==open)  tf.setText("打开");if(e.getSource()==close)  tf.setText("关闭");if(e.getSource()==quit)  System.exit(0);}}class WinLis extends WindowAdapter{public void windowClosing(WindowEvent e){System.exit(0);}}public static void main(String[] args){JFrame f=new test();f.setSize(400,200);//设置窗口可见f.setVisible(true);}
}

对话框设计

对话框(Dialog),也就类似于c++那边的messagebox,是一种特殊的窗体,通过一个或多个组件与用户交互。

与JFrame一样,对话框有边缘、有标题且独立存在的容器,并且不能被其他容器所包容,但是对话框不能作为程序的最外层容器,也不能包含菜单条,此外,Java的对话框上没有最大化和最小化按钮。

Java提供了 JDialog 和 JOptionPane 两类对话框组件。

JOptionPane

JOptionPane提供了许多现成的对话框样式,用户只需使用该类提供的静态方法,指定方法中所需要的参数,JOptionPane对话框就能轻易地显示出来。

可将JOptionPane类的对话框分为4种类型,分别只是给出提示信息的Message Dialog、要求用户进行确认的Confirm Dialog、可输入数据的Input Dialog、和由用户自己定义类型的Option Dialog。

示例展示Message Dialog:

package 测试;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class test implements ActionListener
{JFrame f=null;public test(){f=new JFrame("OptionPane Demo");Container cp=f.getContentPane();cp.setLayout(new GridLayout(2,2));JButton bt=new JButton("Show Error Icon");bt.addActionListener(this);cp.add(bt);bt=new JButton("Show Warning Icon");bt.addActionListener(this);cp.add(bt);bt=new JButton("Show Plain Icon");bt.addActionListener(this);cp.add(bt);bt=new JButton("Show User Define Icon");bt.addActionListener(this);cp.add(bt);//调整此窗口的大小f.pack();//可视f.setVisible(true);f.addWindowListener(new WinLis());}class WinLis extends WindowAdapter{public void windowClosing(WindowEvent e){System.exit(0);}}public static void main(String []args) {new test();}@Overridepublic void actionPerformed(ActionEvent e) {String cmd=e.getActionCommand();//对话框标题名String title="Message Dialog";String message="";//指定信息类型int type=JOptionPane.PLAIN_MESSAGE;if(cmd.equals("Show Error Icon")) {type=JOptionPane.ERROR_MESSAGE;message="Error Message";}else if(cmd.equals("Show Warning Icon")) {type=JOptionPane.WARNING_MESSAGE;message="Warning Message";}else if(cmd.equals("Show Plain Icon")) {type=JOptionPane.PLAIN_MESSAGE;message="Plain Message";}else if(cmd.equals("Show User Define Icon")) {type=JOptionPane.PLAIN_MESSAGE;//输出设置图标的信息对话框JOptionPane.showMessageDialog(f, message,title,type,new ImageIcon("/image/001.jpg"));return;}//输出未设图标的信息对话框JOptionPane.showMessageDialog(f, message,title,type);}
}

实现可输入的对话框(Input Dialog):

package 测试;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class test implements ActionListener
{JFrame f=null;JLabel lb=null;public test(){f=new JFrame("OptionPane Demo");Container cp=f.getContentPane();//面板JPanel pa=new JPanel();pa.setLayout(new GridLayout(2,1));//给Panel加入两个按钮JButton bt=new JButton("Show Text Input");bt.addActionListener(this);pa.add(bt);bt=new JButton("Show ComboBox Input");bt.addActionListener(this);pa.add(bt);lb=new JLabel("",JLabel.CENTER);//在JFrame容器中,上面加上标签(标签很窄),下面加上Panel面板cp.add(lb,BorderLayout.NORTH);cp.add(pa,BorderLayout.CENTER);f.pack();f.setVisible(true);f.addWindowListener(new WinLis());}class WinLis extends WindowAdapter{public void WindowClosing(WindowEvent e) {System.exit(0);}}public static void main(String[] arge) {new test();}@Overridepublic void actionPerformed(ActionEvent e) {String cmd=e.getActionCommand();String title="Input Dialog";String message="您最喜欢哪一种编程语言";int messageType=JOptionPane.QUESTION_MESSAGE;String[] values= {"VB","C++","JAVA","ASP"};String result="";if(cmd.equals("Show Text Input")) {result=JOptionPane.showInputDialog(f,message,title,messageType);}else if(cmd.equals("Show ComboBox Input")) {result=(String)JOptionPane.showInputDialog(f,message,title,messageType,null,values,values[0]);}if(result==null)lb.setText("您取消了对话框");elselb.setText("您输入:"+result);}
}

JDialog对话框

如果JOptionPane提供的样式无法满足我们的需求,就需要使用JDialog来自行设计对话框。用JDialog来制作对话框时,必须制作对话框中的每一个组件,所以比较麻烦。但是,当我们想要了解对话框的更多细节时,还是有必要学习用JDialog来制作对话框的过程的。事实上,当使用JOptionPane时,系统会自动产生JDialog组件,并将JOptionPane的内容放入JDialog的ContentPane中,而不需要我们介入。

需要说一下的是,在JDialog的初始方法中有一个这样的构造方法:

JDialog(Frame owner,String title,boolean modal)

表中的modal是对话框的操作模式,可分为模态和非模态两种,用modal参数的true与false表示。当modal为true,则称为模态对话框,它要求用户在应用程序继续执行之前必须对该对话框进行响应,关闭对话框后才能回到原来的应用程序继续执行。当false时,则称为非模态对话框,非模态对话框则无上述要求。

使用JDialog与JFrame非常类似,要加入组件到JDialog上必须先取得JDialog的ContentPane,然后再把组件加到此ContentPane中

示例:

package 测试;
import javax.swing.*;
import javax.swing.border.*;
import java.awt.*;
import java.awt.event.*;
public class test implements ActionListener
{String s1=" ";JFrame f=null;JLabel lb=new JLabel("对话框示例:");//声明对话框中的文本框引用变量JTextField tf1,tf2;//声明对话框引用变量JDialog dialog;public test(){f=new JFrame("对话框示例");Container cp=f.getContentPane();JPanel pa=new JPanel(new GridLayout(3,1));pa.add(lb);JButton bt=new JButton("进入对话框");bt.addActionListener(this);pa.add(bt);bt=new JButton("结束");bt.addActionListener(this);pa.add(bt);pa.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.blue,3),"对话框示例",TitledBorder.CENTER,TitledBorder.TOP));cp.add(pa,BorderLayout.CENTER);f.pack();f.setVisible(true);f.addWindowListener(new WinLis());}class WinLis extends WindowAdapter{public void WindowClosing(WindowEvent e) {System.exit(0);}}@Overridepublic void actionPerformed(ActionEvent e) {String cmd=e.getActionCommand();if(cmd.equals("进入对话框")) {//在该方法中创建对话框dial();}else if(cmd.equals("结束")) {System.exit(0);}//对话框中的按钮事件if(cmd.equals("确定")) {}else if(cmd.equals("返回")) {s1=tf1.getText();s1=s1+tf2.getText();lb.setText(s1);dialog.dispose();}}public static void main(String[] args) {new test();}public void dial() {//创建对话框对象(模态)dialog=new JDialog(f,"进入对话框",true);//创建对话框的容器对象Container diacp=dialog.getContentPane();//设置所创建对话框的容器的布局JLabel lb1=new JLabel("输入学号:");JLabel lb2=new JLabel("输入姓名:");//面板布局为3行2列JPanel pa1=new JPanel(new GridLayout(3,2));tf1=new JTextField(8);tf2=new JTextField(8);pa1.add(lb1);pa1.add(tf1);pa1.add(lb2);pa1.add(tf2);JButton bt1=new JButton("确定");pa1.add(bt1);bt1=new JButton("返回");bt1.addActionListener(this);pa1.add(bt1);//对话框的容器放入上述面板diacp.add(pa1);//设置对话框的容器的大小dialog.setBounds(150,150,200,150);//将对话框变为可见dialog.setVisible(true);}
}


小插曲:

截止这里终于把Java的UI设计记录完了,后面就是学习多线程、网络、数据库了


异常处理

异常处理机制

Java的异常处理机制用于及时有效地处理程序运行中的异常情况,Java引入了异常和异常类,并且定义了很多异常类,每个异常类代表一类运行错误,类中包含了该运行错误的信息和处理错误的方法等内容。每当Java程序运行过程中发生一个可识别的运行错误时,系统都会产生一个相应异常类的对象,并由系统中相应的机制来处理,以确保不会产生死机、死循环或其他对操作系统有损害的结果,从而保证了整个程序运行的安全性。

在Java程序中,当程序运行过程中发生异常时,可采用两种方法来处理:

  • 程序被终止并显示一些错误信息给用户
  • 使用Java语言提供的 try-catch-finally 语句自行处理异常

第二种方法的优点很多,其中最主要的优点是将处理异常的代码与程序代码的主线分离开,增强了程序的可读性;其次是可减少中途终止程序运行的可能性。

我们来看一个程序自动抛出异常

package 测试;
public class test{public static void main(String[] args) {int a,b,c;a=67;b=0;c=a/b;System.out.println(a+"/"+b+"="+c);}
}

终端输出:

Exception in thread "main" java.lang.ArithmeticException: / by zeroat 测试.test.main(test.java:7)

异常类的继承:

在Java语言中所有的异常类都继承自java.lang.Throwable类。Throwable类有两个直接子类:一个是Error子类,它包含Java系统或执行环境中所发生的异常,这些异常是用户无法捕捉到的;另一个是Exception类,它包含了一般性的异常,例如I/O异常、SQL异常,这些异常是用户可以捕捉到的(我们的try-catch就是要抓这一类的异常),可以通过产生它的子类来创建自己的异常处理

系统定义的运行异常Error类中,除AWTError类在java.awt包中外,其余的全部在java.lang包中

异常处理语句:

try-catch-finally语句

结构如下

        try {//可能发生异常的语句statements   }catch(ExceptionType1 ExceptionObject) {//处理异常的程序代码1Exception Handing  }catch(ExceptionType2 ExceptionObject) {//处理异常的程序代码2Exception Handing  }...finally {//无论是否发生异常都要执行的程序代码Finally Handing}

我们接下来来看一个示例:

package 测试;
public class test{public static void main(String args[]) {int a,b,c;a=67;b=0;try {int x[]=new int[-5];c=a/b;System.out.println(a+"/"+b+"="+c);}catch(NegativeArraySizeException e) {System.out.println("异常:"+e.getMessage());//在命令行打印异常信息在程序中出错的位置及原因e.printStackTrace();}catch(ArithmeticException e) {System.out.println("b=0:"+e.getMessage());}finally {System.out.println("End");}}
}

输出:

异常:null
java.lang.NegativeArraySizeException
Endat 测试.test.main(test.java:8)

printStackTrace的输出是有可能混乱的,原因如下:

printStackTrace()默认使用了System.err输出流进行输出,与System.out是两个不同的输出流,那么在打印时自然就形成了交叉。还有就是输出流是有缓冲区的,所以对于什么时候具体输出也形成了随机。

我们再来看一个嵌套异常的示例:

package 测试;
public class test{static int a,b,c;public static void main(String args[]) {try {a=10;b=0;try {c=a/b;System.out.println("a/b="+c);}//但是改程序其实并没有这个异常catch(IndexOutOfBoundsException E) {System.out.println("捕捉超出索引异常……");}finally {System.out.println("嵌套内层的finally区块");}}catch(ArithmeticException E) {System.out.println("捕捉数学运算异常,b="+b);}finally {System.out.println("嵌套外层的finally区块");if(b==0) {System.out.println("程序执行发生异常!");}else {System.out.println("程序正常执行完毕");}}}
}

输出:

嵌套内层的finally区块
捕捉数学运算异常,b=0
嵌套外层的finally区块
程序执行发生异常!

抛出异常的throw与throws语句

throw

package 测试;
public class test{public static void main(String[] args) {try {throw new NullPointerException("自编异常");}catch(NullPointerException e) {System.out.println("异常:"+e);}}
}
异常:java.lang.NullPointerException: 自编异常

throws

在有些情况下,不需要一个方法本身来处理异常,而是希望把异常向上移交给调用这个方法的方法来处理,此时,就可以用throws语句。

throws的语句格式如下:

returnType methodName(para1,para2,……) throws exception

示例:

package 测试;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JApplet;
public class test extends JApplet{static void throwOne() throws IllegalAccessException{throw new IllegalAccessException("自编异常");}public void paint(Graphics g) {Graphics2D g2=(Graphics2D)g;try {throwOne();}catch(IllegalAccessException e) {g2.drawString("发生异常"+e, 20,20);}}
}


博客:is-hash.com

商业转载 请联系作者获得授权,非商业转载 请标明出处,谢谢

Java的基本学习(五)——高级UI设计与异常处理相关推荐

  1. 什么样的UI设计是高级UI设计?【萧蕊冰】

    哈喽大家好!首先思考一个问题,什么样的UI设计才算是高级UI设计?要想成为一个高级UI设计师,一般都需要具备一些能力,今天这篇文章就来讲一下高级UI设计的要求是哪些,什么样的设计才是高级UI设计. 1 ...

  2. UI设计师需要学习哪些知识?UI设计零基础怎么入门?

    本文由:"学设计上兔课网"原创,图片素材来自网络,仅供学习分享 UI设计师需要学习哪些知识?UI设计零基础怎么入门?很多初学设计的小伙伴都不是很了解ui,觉得UI设计及时做界面.做 ...

  3. BlackBerry高级UI设计

    作者: 王志刚 概论 这篇文档 讲述的 是如何 在 Bla ckB erry 设备上应用 的 UI 效果, 文档的 介绍 的内容包 括如下 部分 : 1 .     基于 M I D P 的 UI 2 ...

  4. 高级UI设计必备三个意识

    你印象中的高级UI设计师是怎样的?是出色的插画能力.独到的设计品味,还是像素级的专业精神.极致的用户体验?是把甲方爸爸Battle成乙方王八的沟通能力,还是上对需求下对开发同时游走于多个project ...

  5. java 美工_为您解读UI设计和美工的区别

    美工和UI设计的区别在什么地方?在前两年这个概念还是很难严格区分开来.美工只是视觉设计的一分部,UI还有操作逻辑.用户体体验方面的内容.比如在开发Android界面设计时,我们会使用到Android ...

  6. Android下基于XML的Graphics shape的高级UI设计,定义圆角背景等

    大家很多人都用过新浪微博android客户端,感觉它的UI实在做到很精致,昨天晚上熬夜研究了新浪微博的UI相关的代码,于是有了下面这个文章. 以前的UI设计一般有两种方式,首先是UI把图形设计好,分解 ...

  7. 在Android上部署深度学习模型之UI设计(七)

    导读 前面介绍了一些Android相关的配置文件,这篇文章我们主要来介绍一下Android UI设计相关的知识,如何来设计界UI. Android的布局 Android的UI主要是利用布局结合控件来设 ...

  8. pythonui教学视频_分享软件开发相关视频教程(Java、C++、Python、UI设计、HTML5、iOS)...

    以下是我收藏的关于开发及其他教程,基本都是花钱在网上买的,网盘没有加密的,虽然特别爱学习,但并不可能有这么多的精力学习这么多,技术总是很快就被新的淘汰掉,放在网盘中确实太浪费呀,分享出去吧,希望想学习 ...

  9. Android学习羁绊之UI设计

    软件开发过程中,界面设计和功能开发同样重要.Android中有多种编写程序界面的方式可供选择.接下来学习一下Android的UI开发. 文章目录 常见UI控件 TextView Button Edit ...

最新文章

  1. java substring 性能_《Java程序性能优化》subString()方法的内存泄露
  2. xshell通过隧道连接_工作常见问题--如何解决xshell远程连接自动断开的问题
  3. Update语句:使用case when按条件批量更新
  4. 图片加载之SDWebImage(上)
  5. python更改list数据类型_python3笔记十一:python数据类型-List列表
  6. 0318互联网新闻 | Snapchat下月进军游戏平台;阿里巴巴将上线二哈智能防骚扰电话的应用程序...
  7. 统计消息总数_2019年度我国出国留学人员总数为70.35万人
  8. ASN.1编解码:asn1c的版本分析-诺基亚
  9. 苹果十年,焦虑在哪?
  10. android 电脑 手柄游戏排行榜,适合手柄玩的安卓游戏推荐
  11. 命令行管理sql server
  12. tcpdf html 格式重叠,使用TCPDF进行HTML呈现(PHP)
  13. js通过资源链接下载文件
  14. fiddler手机抓包教程及电脑断网的配置方法
  15. mysql命令大全(转)
  16. 安装win10 找不到固态硬盘
  17. HTML怎么在背景中加视频,视频加背景图片 怎样把一个视频嵌入到一个图片中
  18. 【测试招聘】资深面试官的测试工程师面试心得
  19. linux aio参数,linux内核aio功能
  20. 使用 dlopen 和 dlsym 来使用 C++ 中的函数、类

热门文章

  1. java狗具有特别的接飞盘的方法_java第七章 多态 课堂笔记/作业
  2. Cannot invoke an object which is possibly ‘undefined‘.Vetur(2722)
  3. hooks useRef 报错object is possibly undefined
  4. 如何实现SQL中加减乘除等四则运算
  5. Cognos Analytics教程之为什么我喜欢 Cognos Analytics:IBM Cognos Analytics 的 15 个特性
  6. 用于RF收发器的简单基带处理器
  7. 怎么能学会做买卖步骤是什么(想做买卖赚钱应该先从什么做起)
  8. 剧推|2019hulu原创剧集激情推荐!
  9. 如何在iOS上创建矢量图形 画云 和 拼图块
  10. matlab坐标污染物浓度,基于MATLAB城市空气质量评价体系.doc