前言
在这里记录一下如何用IDEA进行脱离环境,以防等到lab3就忘记了,而且会进行一些复习(静态检查和动态检查,还有版本控制),毕竟快要考试了
提示:以下是本篇文章正文内容,下面案例可供参考
一、利用IDEA进行Build
我第一次实验是跟着群里大佬的博客做的,小心翼翼用gradle进行构建的,但是这次Lab2大佬的配置文件读不懂。所以就自行探索了一下这个东西到底怎么进行build,我是使用idea自带的功能构建jar文件。(还是跟着大佬学的)
首先进入万能的 project structure,然后打开Artifacts
然后我们点击加号选择jar,然后选择modules with dependencies
然后选择我们想要build的主类
我们选择时候可以选择勾上include tests ,那个奇奇怪怪的.MF文件似乎没有什么用,看看它的目录,要是对我们要求的目录有影响,到时候删掉也没有关系,不过,要注意的是这里一定要选择META-INF文件夹存放路径,同时也要注意不要和其他META-INF重复路径
然后我们点击OK后选择最上面的build那栏,选择build artifacts即可
这时候打开out的文件夹,发现它已经在这里了
我们可以用powerShell运行一下,诶呀出现了错误
很明显是因为那个空格,认为lab2是文件名了,我们加上引号就可以了,可是还是出现了错误
其实这是因为我们在main中使用了文件操作,在我的代码中的根目录设置的src,因此jar包在当前找不到文件,我们只要把它放到跟src一个目录就行了
这样就好了,我们得到了我想要的输出,这里是我在lab2的main中用的语料库是yesterday once more的歌词,输出是一句歌词
二、软构复习之静态检查与动态检查
2.1 静态类型与动态类型语言
Java是一种静态类型的语言。所有变量的类型在编译的时候就已经知道了(程序还没有运行),所以编译器也可以推测出每一个表达式的类型。例如,如果a和b是int类型的,那么编译器就可以知道a+b的结果也是int类型的。事实上,Eclipse在你写代码的时候就在做这些检查,所以你就能够在编辑的同时发现这些问题。
在动态类型语言中(例如Python),这种类型检查是发生在程序运行的时候。
2.2 静态检查、动态检查、无检查
编程语言通常能提供以下三种自动检查的方法:
- 静态检查: bug在程序运行前发现
- 动态检查: bug在程序运行中发现
- 无检查: 编程语言本身不帮助你发现错误,你必须通过特定的条件(例如输出的结果)检查代码的正确性。
很明显,静态检查好于动态检查好于不检查。
2.2.1静态检查
静态类型是静态检查的一种——检查发生在编译的时候。静态检查是我们知道的避免bug的产生的一种方法,其中静态类型就阻止了一大部分和类型相关的bug
- 语法错误,例如多余的标点符号或者错误的关键词。即使在动态类型的语言例如Python中也会做这种检查:如果你有一个多余的缩进,在运行之前就能发现它。
- 错误的名字,例如Math.sine(2). (应该是 sin.)
- 参数的个数不对,例如 Math.sin(30, 20).
- 参数的类型不对 Math.sin(“30”).
- 错误的返回类型 ,例如一个声明返回int类型函数return “30”;
2.2.2 动态检查
- 非法的变量值。例如整型变量x、y,表达式x/y 只有在运行后y为0才会报错,否则就是正确的。
- 无法表示的返回值。例如最后得到的返回值无法用声明的类型来表示。
- **越界访问。**例如在一个字符串中使用一个负数索引。
- 使用一个null对象解引用。(null相当于Python中的None)
2.2.3 区别与联系
静态检查倾向于类型错误 ,即与特定的值无关的错误。正如上面提到过的,一个类型是一系列值的集合,而静态类型就是保证变量的值在这个集合中,但是在运行前我们可能不会知道这个值的结果到底是多少。所以如果一个错误必须要特定的值来“触发”(例如除零错误和越界访问),编译器是不会在编译的时候报错的。
与此相对的,动态类型检查倾向于特定值才会触发的错误。
2.2.4 例子
例子一: 很简单的静态检查的例子:
int n = 5;
if (n) {
n = n + 1;
}
智能的IDEA会报错:
例子二: 有时候是动态检查出错:
int sum = 0;
int n = 0;
int average = sum/n;
报错:
例子三: 但是当我们用double的时候就不会出错,因为double会得到一个无穷
double sum = 7;
double n = 0;
double average = sum/n;
这个例子就属于那种“无报错,但是得到错误的结果”的那种情况,注意区分就是了
2.2.4 一些总结
- 越界访问, 在Java中能够被动态检查检测出来,但是在C和C++这样的语言中则会造成 缓冲区溢出 (能通过编译)列表类型是一个长度可变的序列结构。我们可以这样声明列表:
List<Integer> list = new ArrayList<Integer>();
错误截图:
- final 如果编译器发现你的final变量不仅仅是在初始化的时候被“赋值”,那么它就会报错。换句话说,final会提供不变索引的静态检查。
静态检查下的错误截图:
三、版本控制
3.1 集中式vs分布式
- 先说集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。
- 对于分布式版本控制系统,分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
对比
和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。
3.2 几个可能考的命令
3.2.1 初始化仓库
切到想要的目录下直接git init就行了
3.2.2 文件添加到暂存区
git add readme.txt
3.2.3 文件添加到仓库
git commit -m "wrote a readme file"
-m后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。
3.2.4 查看状态
git status
3.2.4 查看修改
git diff
3.2.4 clone
$ git clone git@github.com:michaelliao/gitskills.git
3.2.5 创建并切换分支
git checkout -b dev
git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:
$ git branch dev //创建分支
$ git checkout dev //切换分支
Switched to branch 'dev'
3.2.6 查看当前分支
git branch命令会列出所有分支,当前分支前面会标一个*号。
3.2.6 合并到主分支
$ git merge dev
3.2.7 与远程仓库合并
如果使用 https://xx.yy/zz.git 作为本地Git仓库的远程仓库,其别名为 origin,若本地git仓库当前正在 master分支上工作,那么以下能够最恰当的将本地仓库中 master分支的最新提交推送至远程仓库的指令是
git fetch origin master
git merge
git push origin master
3.2.8 将GitHub上的某个Git仓库设置为本地仓库的远程仓库
git remote add