每日心得:
今天比昨天好多了,老师花了大半个上午讲了那个创建一个MyStringBuffer的类的作业,说实话昨天没做多少,主要不知道方式,今天讲的时候也没全部听全,不过知道了答题的方式,逻辑理的还行吧。今天主要讲了java.lang中的异常类。
1、error:用于指示合理的应用程序不应该试图捕获的严重问题;一般出了这个,那就不是我能够解决的了,现在暂时不用关心这个;
2、exception:它指出了合理的应用程序想要捕获的条件。异常属于线程里面,发生会终止线程,有传播性,不管则会根据层数逐渐传播到最顶层jvm会将其终止;
异常抛出:方式throws与try-catch-finally,抛出会有三种事物,一个快照(类似电脑休眠,保持计算机原来的状态),一个详细信息(message),一个缘由(cause),finally中的语句一定会执行,如果在前方有语句强制结束了程序,它会在结束前执行,一般用于资源释放。还有部分知识点在下图:
异常又分为checked与runtime
runtime异常与error类似,系统会忽略,因为人为难以解决,父子子类抛出时没有联系,
check异常必须处理,父类抛出的异常类必须大于或等于子类抛出的异常,
但两者都可使线程结束,效果相同,设计原因不明。
java框架中会将check都会转成runtime异常,在编程时不用处理,但不是不处理,会在某工具里集中处理,
自定义异常,java中的异常太大或太小,或者有些情况没概况到有必要设计自己的异常,
再有可以有必要让最顶层使用的人是否知道其异常的原因,或者自己解决不让使用者知道。(这个在架构师时才会想到这么多。我们一般不用处理)。
今天还有一个作业,做一个学生管理系统,按照要求要把异常都处理好。20号终于做完了,每一种非法输入都得想到,还真是挺麻烦的,一开始直接用student[]数组做的,麻烦很多,长度固定,让我只能给一个长度,在使用equals作部分判断时,因为要循环,后面的null值不可避免会遍历到,所以老是导致空指针错误,后面直接使用List方便很多,长度可变,有序性的确让题目好做不少,至少我在把类数组转换为list的时候删去了很多不必要的代码,做这个题目让我得到很多技巧,比如将多次使用的功能放在一个方法内,这样会很大程度上减少代码重复度,更加简洁,也有利于性能,每次错误输入都需要重新再次输入,反复调用相应的方法,老师说系统做完的时间与优化的时间不能差太多,我这优化做的时间太多了,下次还是得争取在做的时候将更多情况考虑到!
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class StudentManager {
public static void main(String[] args) throws Exception {
Student student1=new Student("作者","Qifan_12345678",18,true);
Student student2=new Student("读者","Qifan_23456789",19,false);
stus.add(student1);
stus.add(student2);
system();
}
static BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
static List<Student> stus = new ArrayList<StudentManager.Student>();
static String regex = "[\u4E00-\u9FA5]+";
static String regex2 = "^[0-9]*+";
static class Student{
private String name;//中文,且不超过5个字
private String stuNo;//Qifan_8个数字
private int age;// 18-25之间
private boolean gender;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getStuNo() {
return stuNo;
}
public void setStuNo(String stuNo) {
this.stuNo = stuNo;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean isGender() {
return gender;
}
public void setGender(boolean gender) {
this.gender = gender;
}
public Student(String name,String stuNo,int age,boolean gender) {
this.name = name;
this.stuNo = stuNo;
this.age = age;
this.gender = gender;
}
}
static void system() {
stuhe();
try {
String Str = reader.readLine();
int key =Integer.parseInt(Str);
if(key>0&&key<5){
switch (key) {
case 1:
addstu();
break;
case 2:
deletestu();
break;
case 3:
updatestu();
break;
case 4:
querystu();
isqureystu();
break;
case 5:
System.out.println("退出系统成功!");
System.exit(0);
break;
}
}else{
System.out.println("");
System.out.println("请输入1~5的功能数字!");
system();
}
} catch (Exception e) {
System.out.println("");
System.out.println("请输入功能数字!");
system();
}
}
static void stuhe(){
System.out.println("欢迎进入学生管理系统!");
System.out.println("1、添加学生");
System.out.println("2、删除学生");
System.out.println("3、修改学生");
System.out.println("4、查询学生");
System.out.println("5、退出系统");
System.out.print("请选择功能输入数字>>>>>");
}
static String inname() throws IOException{
System.out.println("请输入姓名:");
String sname = reader.readLine();
if(sname.length()<0||sname.length()>6||!(sname.matches(regex))){
System.out.println("姓名格式为五个字以内的中文!");
sname=inname();
}
return sname;
}
static String inno() throws IOException{
System.out.println("请输入学号:");
String sno = reader.readLine();
if(sno.length()!=8||!(sno.matches(regex2))){
System.out.println("学号格式为8个数字以内!");
sno =inno();
}
return sno;
}
static int inage() throws IOException{
System.out.println("请输入需要添加的年龄:");
String sage = reader.readLine();
int iage=0;
if(sage.length()==2&&(sage.matches(regex2))){
iage=Integer.valueOf(sage);
if(iage<18&&iage>25){
System.out.println("年龄为18到25岁!");
iage =inage();
}else{
iage=Integer.valueOf(sage);
}
}else{
System.out.println("年龄为18到25岁!");
iage =inage();
}
return iage;
}
static boolean ingen() throws IOException{
System.out.println("请输入需要添加的性别:");
String gender = reader.readLine();
boolean b=true;
if(gender.equals("男")){
gender="true";
b=Boolean.valueOf(gender);
}else if(gender.equals("女")){
gender="false";
b=Boolean.valueOf(gender);
}else{
System.out.println("请输入性别(男/女):");
b=ingen();
}
return b;
}
static void yn(int i) throws IOException{
switch (i) {
case 1:
System.out.println("输入y继续添加,n退回主菜单");
break;
case 2:
System.out.println("输入y继续删除,n退回主菜单");
break;
case 3:
System.out.println("输入y继续修改,n退回主菜单");
break;
}
String key = reader.readLine();
if(key.equals("y")){
switch (i) {
case 1:
addstu();
break;
case 2:
deletestu();
break;
case 3:
updatestu();
break;
}
}else if(key.equals("n")){
system();
}else{
System.out.println("请输入y/n!");
yn(i);
}
}
static void addstu() throws IOException {
querystu();
String sname=inname();
String sno = inno();
for(int i=0;i<stus.size();i++){
if((stus.get(i)).getStuNo().equals("Qifan_"+sno)){
System.out.println("该学号已存在!,请重新输入!");
sno=inno();
}
}
int sage = inage();
boolean b = ingen();
Student s1=new Student(sname,"Qifan_"+sno,sage,b);
stus.add(s1);
querystu();
System.out.println("添加成功!");
yn(1);
}
static void deletestu()throws IOException{
querystu();
System.out.println("请输入需要删除的学号或姓名:");
String s = reader.readLine();
String text="";
for(int i=0;i<stus.size();i++){
if((stus.get(i).getName()).equals(s)||(stus.get(i).getStuNo()).equals("Qifan_"+s)){
System.out.println("确认删除?y/n");
String key1 = reader.readLine();
if(key1.equals("y")){
stus.remove(i);
querystu();
text="删除成功!";
}else if(key1.equals("n")){
text="已取消删除!";
}
break;
}else{
text="没有此人,删除失败!";
}
}
System.out.println(text);
yn(2);
}
static void updatestu()throws IOException{
querystu();
String s = inno();
String text="";
for(int i=0;i<stus.size();i++){
if((stus.get(i)).getStuNo().equals("Qifan_"+s)){
String n = inname();
System.out.println("确认修改?y/n");
String key1 = reader.readLine();
if(key1.equals("y")){
stus.get(i).setName(n);
querystu();
text="修改成功!";
}else if(key1.equals("n")){
text="已取消修改!";
}
break;
}else{
text="没有此人,修改失败!";
}
}
System.out.println(text);
yn(3);
}
static void querystu(){
System.out.println("学生列表:");
for(int i=0;i<stus.size();i++){
if(stus.get(i)!=null){
System.out.println(stus.get(i));
}
}
}
static void isqureystu() throws IOException{
System.out.println("输入y进行精准查询,n退回主菜单");
String key = reader.readLine();
if(key.equals("y")){
String sname = inname();
for(int i =0;i<stus.size();i++){
if(stus.get(i)!=null&&(stus.get(i).getName()).equals(sname)){
System.out.println(stus.get(i));
}else{
System.out.println("查无此人!");
}
isqureystu();
}
}else if(key.equals("n")){
system();
}else{
System.out.println("请输入y/n!");
isqureystu();
}
}
}