HIT软件构造 blog4

本文介绍了如何使用IDEA构建JAR文件,包括设置Artifacts和主类,以及解决运行时的错误。此外,文章还详细阐述了静态检查与动态检查的区别,强调了静态检查在防止类型错误方面的优势,并给出了相关例子。最后,讨论了版本控制中的集中式与分布式版本控制系统,并列举了一些常用的Git命令。
摘要由CSDN通过智能技术生成


前言

在这里记录一下如何用IDEA进行脱离环境,以防等到lab3就忘记了,而且会进行一些复习(静态检查和动态检查,还有版本控制),毕竟快要考试了


提示:以下是本篇文章正文内容,下面案例可供参考

一、利用IDEA进行Build

我第一次实验是跟着群里大佬的博客做的,小心翼翼用gradle进行构建的,但是这次Lab2大佬的配置文件读不懂。所以就自行探索了一下这个东西到底怎么进行build,我是使用idea自带的功能构建jar文件。(还是跟着大佬学的)
首先进入万能的 project structure,然后打开Artifacts
Artifacts
然后我们点击加号选择jar,然后选择modules with dependencies
modules with dependencies
然后选择我们想要build的主类
选择主类
我们选择时候可以选择勾上include tests ,那个奇奇怪怪的.MF文件似乎没有什么用,看看它的目录,要是对我们要求的目录有影响,到时候删掉也没有关系,不过,要注意的是这里一定要选择META-INF文件夹存放路径,同时也要注意不要和其他META-INF重复路径

然后我们点击OK后选择最上面的build那栏,选择build artifacts即可
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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值