在做第一个项目时遇到的问题

1. StackOverflowError异常
意思:栈内存溢出
原因:栈深度超过虚拟机分配给线程的栈大小
常发生于方法的无限递归调用(没有结束递归的条件)
在写Student信息时,由于经常要调到Student()方法,出现了该异常
解决办法:
生成 serialVersionUID
具体操作:
![在这里插入图片描述](https://img-blog.csdnimg.cn/6af8723611164fe98b861ee51a47ebd2.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBATmV3QWdlLCBDb25hbg==,size_20,color_FFFFFF,t_70,g_se,x_1
1.点击 File,点击Settings,然后![!](https://img-blog.csdnimg.cn/3a264d05003648ca98c3efed9816aead.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBATmV3QWdlLCBDb25hbg==,size_20,color_FFFFFF,t_70,g_se,x_16
2.设置之后,选中对应的类名,然后按 alt-enter 快捷键,点击就可以自动生成了。在这里插入图片描述

2. StreamCorruptedException异常
异常出现的原因:ObjectOutputStream的构造函数会向输出流中写入一个标识头,而ObjectInputStream会首先读入这个标识头.因此,多次以追加方式向一个文件中写入 object 时,该文件将会包含多个标识头.所以用ObjectInputStream来deserialize这个ObjectOutputStream时,将产生StreamCorruptedException.
解决办法:将原文档内容删除后重新添加一下(目前没有找到更好的办法(可以再查一查怎么把后面的头文件删除(***-----------保留问题一***)))

3. 一个class如何调用另一个class中的方法
1- new一个其它 class 的实例,通过实例调用该方法
2-使用 stastic 静态方法,可以直接调用,但使用静态方法太耗内存,不建议使用

4. 泛型
详细见 https://www.cnblogs.com/jpfss/p/9928747.html
泛型,即“参数化类型”。
解释:将具体的类型参数化,类似于方法中的变量参数
三种使用方式:泛型类、泛型接口、泛型方法
举例:class<1> , 1可以随便写
implement<1>
Add<1>

在使用/调用时传入具体的类型(类型实参),如自定义的 Student 类型

在结束之后接下来的计划:
1.正则表达式下去可以多了解一点

5. Pattern与Matcher
详细见 https://www.cnblogs.com/gdwkong/articles/7782331.html
Pattern与Matcher 一起合作.Matcher类提供了对正则表达式的分组支持,以及对正则表达式的多次匹配支持. 单独用Pattern只能使用Pattern.matches(String regex,CharSequence input)一种最基础最简单的匹配。
Pattern.matcher(CharSequence input)返回一个Matcher对象.

Matcher类的构造方法也是私有的,不能随意创建,只能通过Pattern.matcher(CharSequence input)方法得到该类的实例.
Pattern类只能做一些简单的匹配操作,要想得到更强更便捷的正则匹配操作,那就需要将Pattern与Matcher一起合作.Matcher类提供了对正则表达式的分组支持,以及对正则表达式的多次匹配支持.
我在这次的项目中使用过,代码如下::
Pattern p = Pattern.compile("1{0,1}(\d+)$");
Matcher m = p.matcher(water01);

6.小问题一(弄了好久,一直 break;调方法 break;调方法,肝疼)
在输入格式错误一直错误的时候,需要让它一直重新输入(返回该方法,即嵌套)
方法(使用 continue 关键字):

    public double inputWater() {
/*        System.out.println("请输入用水量(正整数,包括0):");
        Scanner sc = new Scanner(System.in);
        double water = 0;
        while (true) {
            String water01 =sc.next();
            Pattern p = Pattern.compile("^[+]{0,1}(\\d+)$");
            Matcher m = p.matcher(water01);
            if (m.matches()) {
                water = Double.valueOf(water01);
                break;
            }else{
                System.out.println("格式错误! ");
                //sc.nextLine();
                inputWater();
                break;
            }
        }*/
        double water = 0;
        while(true) {
            System.out.println("请输入用水量(正整数,包括0):");
            Scanner sc  = new Scanner(System.in);
            try {
                String water01 =sc.next();
                String regex = "^[+]{0,1}(\\d+)$";
                if(!(water01.matches(regex)) )throw new Exception();
                if((water01.matches(regex))){
                    water = Double.valueOf(water01);
                }
            } catch(Exception e) {
                System.out.println("格式错误!");
                continue;            //------------------换成 continue;
            }
            break;  //必须要 try-catch 一下
        }
        return water;
    }

7. 小问题二之 if-else if - else 那个大病(仍未解决,再查查,哪位好心人帮帮忙在这里插入图片描述已经):
if(sc.nextInt() == 0)
……
else if(sc.nextInt() == 1)
……
else
在运行时(2)总是需要多输一次 1 ,绝绝子!(偶尔会变得正常一点,只用输一次)

算了,还是用 switch吧!我这里的代码用 switch 有点冗长。。。


  1. + ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值