以下内容均摘抄自Java2实用教程(第五版)
异常类
Java使用throw关键字抛出一个Exception子类的实例表示异常发生。例如,java.long包中的Integer类调用其类方法public static int parseInt(String s)可以将”数字“格式的字符串,如”6789“,转化为Int型数据,但是当试图将字符串”ab89"转换成数字时,例如Example1:
int number = Integer.parseInt("ab89");
方法parseInt()在执行的过程中就会抛出NumberFormatException对象(使用throw关键字抛出一个NumberFormatException对象),即程序运行出现NumberFormatException异常。
Java允许定义方法时声明该方法调用过程中抛出异常对象,终止当前方法的继续执行。例如,流对象在调用read方法读取一个不存在的文件时,就会抛出IOException异常对象。
异常对象可以调用如下方法得到或输出有关异常的信息。
public String getMessage();
public void printStackTrace();
public String toString();
try-catch语句
Java使用try-catch语句来处理异常,将可能出现的异常操作放在try-catch语句的try部分,一旦try部分抛出异常对象,或调用某个可能抛出异常对象的方法,并且该方法抛出了异常对象,那么try部分将立刻结束执行,转向执行相应的catch部分。所以程序可以将发生异常后的处理放在catch部分。try-catch语句可以由几个catch组成,分别处理发生的相应异常。
try-catch属于的格式如下:
try {
包含可能发生异常的语句
}
catch(ExceptionSubClass1 e) {
...
}
catch(ExceptionSubClass2 e) {
...
}
各个catch参数中的异常类都是Exception的某个子类,表明try部分可能发生的异常,这些子类之间不能有父子关系,否则保留一个含有父类参数的catch即可。
Example2程序运行结果如图所示:
发生异常: For input string:"ab89"
n=0,m=8888,t=1000
故意抛出I/O异常!
发生异常:我是故意的
Example 2
public class Example2 {
public static void main (String args[]){
int n = 0,m = 0,t = 1000;
try{ m = Integer.parseInt("8888");
n = Integer.parseInt("ab89");//发生异常,转向catch
t = 7777;//t没有机会被赋值
}
catch(NumberFormatException e) {
System.out.println("发生异常:"+e.getMessage());
}
System.out.println("n="+n+",m="+m+",t="+t);
try{ System.out.println("故意抛出I/O异常!");
throw new java.io.IOEException("我是故意的");//故意抛出异常
//System.out.println("这个输出语句肯定没有机会执行,必须注释,否则编译出错");
}
catch(java.io.IOEException e) {
System.out.println("发生异常:"+e.getMessage());
}
}
}
自定义异常类
在编写程序时可以扩展Exception类定义自己的异常类,然后根据程序的需要来规定哪些方法产生这样的异常。一个方法在声明时可以使用throws关键字声明要产生的若干个异常,并在该方法的方法体中具体给出产生异常的操作,即用相应的异常类创建对象,并使用throw关键字抛出该异常对象,导致该方法结束执行。程序必须在try-catch块语句中调用可能发生异常的方法,其中catch的作用就是捕获throw关键字抛出的异常对象。
注:throw是Java的关键字,该关键字的作用就是抛出异常。throw和throws是两个不同的关键字。
通常情况下,计算两个整数之间之和的方法不应但有任何异常发生,但是,对某些特殊应用程序,可能不允许同号的整数做求和运算,比如当一个整数代表收入,一个整数代表支出时,这两个整数就不能是同号。下面的例子中,Bank类中有一个income(int in ,int out)方法,对象调用该方法时,必须向参数in传递正整数,向参数out传递负数,并且int+out必须大于等于0,否则该方法就抛出异常。因此,Bank类在声明income(int in,int out)方法时,使用throws关键字声明要产生的异常。程序运行效果如图所示:
本次计算出的纯收入是:100元
本次计算出的纯收入是:200元
本次计算出的纯收入是:300元
银行目前有600元
计算收益的过程出现如下问题:
入账资金200是负数或支出是支出是100是正数,不符合系统要求。
银行目前有600元
BankException.java
public class BankException extends Exception {
String message;
pubiic BankException(int m,int n) {
message = "入账资金"+m+"是负数或支出"+n+"是正数,不符合系统要求.";
}
public String warnMess(){
return message;
}
}
public class Bank {
privete int money;
public void income (int in,int out) throws BankException {
if (in<=0||out>=0||int+out<=0) {
throw new BankException(in,out);//方法异常,导致方法结束
}
int netIncome = in + out;
System.out.printf("本次计算出的纯收入是:%d元\n“,netIncome);
money = money+netIncome;
}
pubilc int getMoney() {
return money;
}
}
public class Example {
public static void main(String args[]{
Bank bank = new Bank();
try { bank.income(200,-100);
bank.income(300,-100);
bank.income(400,-100);
System.out.printf("银行目前有%d元\n“,bank.getMoney());
bank.income(200,100);
bank.income(99999,-100);
}
catch(BankException e){
System.out.println("计算收益的过程出现如下问题:”);
System.out.println(e.warnMess());
}
System.out.printf("银行目前有%d元\n",bank.getMoney());
}
}
常用类
- String类
- StringTokenizer类
- Scanner类
- StringBuffer类
- Date类与Calendar类
- 日期格式化类
- Math类、BigInteger类与Random类
- 数字格式化
- Class类与Console类
- Pattern与Match类
常用容器
中间容器必须被添加到底层容器中才能发挥作用
➊JPanel面板
经常使用JPanel创建一个面板,
再向这个面板添加组件,
然后把这个面板添加到其他容器中。
JPanel面板的默认布局是FlowLayout布局。
❷JTabbedPane选项卡窗格
可以使用JTabbedPane容器作为中间容器。
当用户向JTabbedPane容器添加一个组件时,JTabbedPane容器就会自动为该组件指定个对应的选项卡, 即让一一个选项卡对应一个组件。各个选项卡对应的组件层叠式放入JTabbedPane容器,当用户单击选项卡时,JTabbedPane容器将显示该选项卡对应的组件。选项卡默认在JTabbedPane容器的顶部,从左向右依次排列。JabbedPane容器可以使用
add(String text, Component c) ;
方法将组件c添加到JTabbedPane容器中,并指定和组件c对应的选项卡的文本提示是text.可以使用构造方法
public JTabbedPane (int tabPlacement)
创建JTabbedPane容器,选项卡的位置由参数tabPlacement 指定,该参数的有效值为JTabbedPane.TOP、JTtabbedPane.BOTTOM、 JTabbedPane.LEFT 和JTabbedPane.RIGHT.
❸滚动窗格JScrollPane
滚动窗格只可以添加一个组件,可以把个组件放到一个滚动窗格中,然后通过滚动条来观看该组件。JTextArea 不自带滚动条,因此就需要把文本区放到一个滚动窗格中。例如:
JScrollPane scroll=new JScrollPane (new JTextArea()) ;
❹拆分窗格JSplitPane
顾名思义,拆分窗格就是被分成两部分的容器。拆分窗格有两种类型:水平拆分和垂直拆分。水平拆分窗格用一条拆分线把窗格分成左右两部分,左面放一个组件, 右面放一个组件,拆分线可以水平移动。垂直拆分窗格用一条拆分线把窗格分成上下两部分,上面放一 一个组件,下面放一个组件,拆分线可以垂直移动。
JSplitPane的两个常用的构造方法如下:
JSplitPane (int a, Component b, Component c)
参数a取JSplitPane的静态常量HORIZONTAL_SPLIT 或VERTICAL_SPLIT,以决定是水平还是垂直拆分。后两个参数决定要放置的组件。
JSplitPane(int a, boolean b, Component c, Component d)
参数a取JSplitPane的静态常量HORIZONTAL_ SPLIT或VERTICAL_SPLIT,以决定是水平还是垂直拆分,参数b决定当拆分线移动时,组件是否连续变化(true 是连续)。
❺JLayeredPane分层窗格
如果添加到容器中的组件经常需要处理重叠问题,就可以考虑将组件添加到分层窗格。分层窗格分成5个层,分层窗格使用
add (Jcomponent com, int layer) ;
添加组件com,并指定com所在的层,其中参数layer的取值为JLayeredPane类中的类常量:DEFAULT_LAYER、PALETTE_ LAYER、MODAL_ LAYER、POPUP_ LAYER、DRAG_ LAYER。DEFAULT_LAYER层是最底层,添加到DEFAULT_ LAYER层的组件如果和其他层的组件发生重叠时,将被其他组件遮挡。
DRAG_ LAYER层是最上面的层,如果分层窗格中添加了许多组件,当用户用鼠标移动一组件时,可以把该组件放到DRAG_ LAYER层,这样,用户在移动组件的过程中,该组件就不会被其他组件遮挡。添加到同一层上的组件,如果发生重叠,后添加的会遮挡先添加的组件。分层窗格调用public void setLayer(Component c,int layer)可以重新设置组件C所在的层,调用public int getLayer(Component c)可以获取组件c所在的层数。