一、自定义异常
1)所谓自定义异常,通常就是定义了一个继承自Exception类的子类,那么这个类就是一个自定义异常类;通常情况下我们都会直接继承Exception类,一般不会继承自某个运行时的异常类。
2)我们可以使用多个catch块来捕获异常,这时需要将父类型的catch块放到子类型的catch块之后,这样才能保证后续的catch可能被执行,否则子类型的catch将永远无法到达,Java编译器会报错误;如果多个catch块的异常类型是独立的,那么谁前谁后都可以。
3)如果try块中存在return语句,那么首先也需要将finally块中的代码执行完毕,然后再返回;如果try块中存在System.exit(0)语句,那么就不会执行finally块中代码,因为System.exit(0)会终止当前运行的java虚拟机,程序会在虚拟机终止前停止执行。
二、GUI(Graphical User Interface),图形用户界面,分为:AWT,Swing
1)AWT(Abstract Window ToolKit),抽象窗户工具集,第一代的Java GUI组件,是重量级的。
三、练习
1)通过命令行输入一串字符,首先判断这些字符是否都为数字。如果其中有字符不是数字,那么直接在命令行山输出“用户输入的字符不都为数字,无法转换”,程序结束;如果用户输入的字符都为字符,那么将该数字转换为中文的大写表示(用户每次最多输入八个字符);
输入输出例子:
输入:1234567
输出:一百二十三万四千五百六十七
输入:0001
输出:一
输入:1001
输出:一千零一
输入:1100
输出:一千一百
输入:10100
输出:一万零一百
输入:0010
输出:十
输入:000000001
输出:一
package digitchange;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
public class DigitChange
{
private static final HashMap<String, String> map = new HashMap<String, String>(); //key存储数字,value存储数字对应的汉字
static
{
map.put("0", "零");
map.put("1", "壹");
map.put("2", "贰");
map.put("3", "叁");
map.put("4", "肆");
map.put("5", "伍");
map.put("6", "陆");
map.put("7", "柒");
map.put("8", "捌");
map.put("9", "玖");
map.put("10", "拾");
}
private void check(String str) //用于检测用户输入的字符串是否合法
{
for(int i = 0; i < str.length(); i++)
{
if(str.charAt(i) >= '0' && str.charAt(i) <= '9')
{
}
else
{
System.out.println("用户输入的字符不都为数字,无法转换");
System.exit(0);
}
}
}
private void lengthIsOne(String str) //输入字符个数为1的转换方法
{
System.out.print(map.get(str));
}
private void lengthIsTwo(String str) //输入字符个数为2的转换方法
{
if(str.charAt(0) == '0')
{
this.lengthIsOne(str.substring(1, 2));
}
else if(str.charAt(1) == '0')
{
if("10".equals(str))
{
System.out.print("拾");
}
else
{
System.out.print(map.get(str.substring(0, 1)) + "拾");
}
}
else
{
System.out.print(map.get(str.substring(0, 1)) + "拾" + map.get(str.substring(1, 2)));
}
}
private void lengthIsThree(String str) //输入字符个数为3的转换方法
{
if(str.charAt(0) == '0')
{
this.lengthIsTwo(str.substring(1, 3));
}
else if(str.charAt(1) == '0')
{
if("00".equals(str.substring(1,3)))
{
System.out.print(map.get(str.substring(0, 1)) + "百");
}
else
{
System.out.print(map.get(str.substring(0, 1)) + "百零" + map.get(str.substring(2, 3)));
}
}
else if(str.charAt(2) == '0')
{
System.out.print(map.get(str.substring(0, 1)) + "百" + map.get(str.substring(1, 2)) + "拾");
}
else
{
System.out.print(map.get(str.substring(0, 1)) + "百" + map.get(str.substring(1, 2)) + "拾"
+ map.get(str.substring(2, 3)));
}
}
private void lengthIsFour(String str) //输入字符个数为4的转换方法
{
if(str.charAt(0) == '0')
{
this.lengthIsThree(str.substring(1, 4));
}
else if(str.charAt(1) == '0')
{
if("000".equals(str.substring(1, 4)))
{
System.out.print(map.get(str.substring(0, 1)) + "仟");
}
else if("10".equals(str.substring(2, 4)))
{
System.out.print(map.get(str.substring(0, 1)) + "仟零拾");
}
else
{
System.out.print(map.get(str.substring(0, 1)) + "仟零");
this.lengthIsTwo(str.substring(2, 4));
}
}
else if(str.charAt(2) == '0')
{
if("00".equals(str.substring(2, 4)))
{
System.out.print(map.get(str.substring(0, 1)) + "仟" + map.get(str.substring(1, 2)) + "百");
}
else
{
System.out.print(map.get(str.substring(0, 1)) + "仟" + map.get(str.substring(1, 2)) + "百零");
this.lengthIsOne(str.substring(3, 4));
}
}
else if(str.charAt(3) == '0')
{
System.out.print(map.get(str.substring(0, 1)) + "仟 " + map.get(str.substring(1, 2)) + "百" + map.get(str.substring(2, 3))
+ "拾");
}
else
{
System.out.print(map.get(str.substring(0, 1)) + "仟 " + map.get(str.substring(1, 2)) + "百" + map.get(str.substring(2, 3))
+ "拾" + map.get(str.substring(3, 4)));
}
}
private void lengthIsFive(String str) //输入字符个数为5的转换方法
{
String s1 = str.substring(0, 1);
String s2 = str.substring(1);
if(s1.charAt(0) == '0')
{
this.lengthIsFour(s2);
}
else if(s2.charAt(0) == '0')
{
if("0000".equals(s2))
{
this.lengthIsOne(s1);
System.out.print("万");
}
else
{
this.lengthIsOne(s1);
System.out.print("万零");
this.lengthIsThree(s2.substring(1));
}
}
else
{
this.lengthIsOne(s1);
System.out.println("万");
this.lengthIsFour(str.substring(1));
}
}
private void lengthIsSix(String str) //输入字符个数为6的转换方法
{
String s1 = str.substring(0, 2);
String s2 = str.substring(2);
if("00".equals(s1))
{
this.lengthIsFour(s2);
}
else if(s2.charAt(0) == '0')
{
if("0000".equals(s2))
{
this.lengthIsTwo(s1);
System.out.print("万");
}
else
{
this.lengthIsTwo(s1);
System.out.print("万零");
this.lengthIsThree(s2.substring(1));
}
}
else
{
this.lengthIsTwo(s1);
System.out.print("万");
this.lengthIsFour(s2);
}
}
private void lengthIsSeven(String str) //输入字符个数为7的转换方法
{
String s1 = str.substring(0, 3);
String s2 = str.substring(3);
if("000".equals(s1))
{
this.lengthIsFour(s2);
}
else if(s2.charAt(0) == '0')
{
if("0000".equals(s2))
{
this.lengthIsThree(s1);
System.out.print("万");
}
else
{
this.lengthIsThree(s1);
System.out.print("万零");
this.lengthIsThree(s2.substring(1));
}
}
else
{
this.lengthIsThree(s1);
System.out.print("万");
this.lengthIsFour(s2);
}
}
private void lengthIsEight(String str) //输入字符个数为八的转换方法
{
String s1 = str.substring(0, 4);
String s2 = str.substring(4);
if("0000".equals(s1))
{
this.lengthIsFour(s2);
}
else if(s2.charAt(0) == '0')
{
if("0000".equals(s2))
{
this.lengthIsFour(s1);
System.out.print("万");
}
else
{
this.lengthIsFour(s1);
System.out.print("万零");
this.lengthIsThree(s2.substring(1));
}
}
else
{
this.lengthIsFour(s1);
System.out.print("万");
this.lengthIsFour(s2);
}
}
public void change(String str) //对用户输入的字符进行检查和转换
{
this.check(str);
if(str.length() == 1)
{
this.lengthIsOne(str);
}
else if(str.length() == 2)
{
this.lengthIsTwo(str);
}
else if(str.length() == 3)
{
this.lengthIsThree(str);
}
else if(str.length() == 4)
{
this.lengthIsFour(str);
}
else if(str.length() == 5)
{
this.lengthIsFive(str);
}
else if(str.length() == 6)
{
this.lengthIsSix(str);
}
else if(str.length() == 7)
{
this.lengthIsSeven(str);
}
else
{
this.lengthIsEight(str);
}
System.out.println();
}
public static void main(String[] args) throws IOException
{
System.out.println("请输入字符(字符个数最多为八个):");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = null;
str = br.readLine();
while(str.length() == 0)
{
System.out.println("用户未输入字符,请输入字符(字符个数最多为八个):");
str = br.readLine();
}
while(str.length() > 8)
{
System.out.println("输入字符个数超过八个,请重新输入:");
str = br.readLine();
}
DigitChange d = new DigitChange();
d.change(str);
}
}
2)
编写一个小型的应用程序框架,该框架会向用户公开一个run方法,方法声明为:
public void run(String className);
该方法位于类ApplicationRun类中,该类的声明为:
public class ApplicationRun
{
public void run(String className)
{
//这里是方法的执行代码
}
}
其中的字符串参数className为用户提供一个类的全名(包名+类名),当用户将类的全名一字符串的形式传递给该run方法时,run方法会自动执行用户所提供的类中所有被@Test注解所修饰的public void 且不带参数的方法。
@Test注解为该小型应用程序框架所定义的,用户可以使用该注解修饰自己的方法,同时该@Test注解只能用于修饰方法。
package applicationrun;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value = ElementType.METHOD)
public @interface Test
{
String value() default "hello";
}
package applicationrun;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
public class ApplicationRun
{
private Class<?> classType;
public void run(String className) throws ReflectiveOperationException
{
classType = Class.forName(className);
Object obj = classType.newInstance();
Method[] method = classType.getDeclaredMethods();
for(Method m : method)
{
if(void.class.equals(m.getReturnType()) && m.getModifiers() == Modifier.PUBLIC
&& m.getParameterTypes().length == 0)
{
if(m.isAnnotationPresent(Test.class))
{
m.invoke(obj, new Object[]{});
}
}
}
}
}