Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >这些小 Bug,99% 的程序员都写过!

这些小 Bug,99% 的程序员都写过!

作者头像
程序员鱼皮
发布于 2024-12-27 11:23:02
发布于 2024-12-27 11:23:02
16400
代码可运行
举报
文章被收录于专栏:鱼皮客栈鱼皮客栈
运行总次数:0
代码可运行

“程序怎么运行不了,不应该啊?” “程序怎么能运行了,不应该啊!”

这句话是不是让程序员朋友们的 DNA 动了呢?今天鱼皮分享一些新手程序员常犯的小 Bug,很多是我自己或者网友们的亲身经历,相信绝大多数程序员都写过这些 Bug~

程序员经典小 Bug

1、标点符号错误

刚学编程语言的很多同学应该都被这个错误折磨过,比如在代码中使用中文逗号()或引号(“”),结果就导致了编译错误。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 使用了中文逗号,编译会报错
Map<String, Integer> map = new HashMap<>();
map.put("key1"1);

我之前就遇到过一位同学,把类似上面的代码拍了个照,然后问我哪里有错,我当时快把眼珠子瞪出来了,也没发现问题:

结果后面他自己发现问题了,我知道真相后直接红温了。

其实这类 Bug 很好自己解决,开发工具都会给出提示的,只不过由于新手不知道要去看错误信息罢了。

2、更新数据没指定范围

现在的数据库操作框架封装得太好了,以至于很多同学都不怎么自己写 SQL,查询语句可能还写过一点儿,但更新语句基本上没写过。这就导致了很多低级问题,比如在更新或删除数据时,忘记加上 WHERE 条件。像之前我分享过,我们团队一位同学更新某个用户权限的时候,不小心把所有用户的权限都刷成了 “管理员”。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
UPDATE orders SET role = 'admin';

一般有经验的开发者看到数据更新或删除操作,就条件反射想到要加 WHERE 条件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
UPDATE orders SET role = 'admin'
WHERE id = xxx

企业中通常也会给数据库加上限制,防止范围更新和删除。

3、资源忘记释放

在开发中,文件、数据库连接、内存、网络连接都属于资源,如果打开了资源没有释放,就有可能因为资源泄露导致程序崩溃,很多线上 Bug 都是这么来的。

比如打开一个文件,却没有关闭:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void readFile(String path) throws IOException {
    FileReader reader = new FileReader(path);
    char[] buffer = new char[1024];
    reader.read(buffer);
    // 忘记关闭文件
}

平时要养成好的习惯,只要打开了资源,都要看看有没有 close 方法。如果有的话,再确认该资源会不会自动关闭;如果不会自动关闭,就要手动释放资源。

Java 中,可以在 finally 块中、或者使用 try-with-resources 语法自动释放资源:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void readFile(String path) throws IOException {
    try (FileReader reader = new FileReader(path)) {
        char[] buffer = new char[1024];
        reader.read(buffer);
    }
}
4、明文存储隐私数据

这也是一类低级错误,比如在数据库中明文存储用户的密码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
INSERT INTO users (username, password)
VALUES ('admin', '123456');

好好好,这下管理员爽翻了!

标准做法是,使用哈希算法 + 盐值加密存储密码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
String hashedPassword = BCrypt.hashpw("123456", BCrypt.gensalt());

虽然这个错误很低级,但可千万别小看它。某公司因为明文存储密码被处罚了 9100 万欧元!

类似的错误还有直接从前端明文发送密码给后端,虽然可以通过 HTTPS 协议增强安全性,但 HTTPS 只保证传输加密,服务端和客户端仍能看到密码明文,攻击者可能通过日志窃取密码。

5、前端存储秘钥

这也是一类低级错误,经常出现于调用第三方 API 的时候。

比如需要调用一个第三方天气服务 API,为了省事,前端直接将秘钥写到了 JS 代码中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 第三方 API 秘钥
const API_KEY = "yupi123456";
// 调用 API
async function getWeather(city) {
  const url = `https://codefather.cn/weather?city=${city}&apikey=${API_KEY}`;
  const response = await fetch(url);
  const data = await response.json();
  console.log(data);
}

这样一来,用户直接打开 F12 控制台,就能看到你的秘钥了,即使对 JS 代码加密混淆,也能轻而易举被找到。

所有前端的内容都是不安全的。 如果有调用第三方 API 的需求,最好还是通过后端进行转发。

6、忘记区分环境

刚在企业中接触多环境的同学,可能会不小心把测试环境的代码或配置部署到生产环境。

比如 Java 项目使用 application.yml 文件来管理配置,测试代码时,我先把数据库改为测试库:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/dev_db

结果上线前,忘了把配置改回来,导致线上环境找不到这个数据库或者因为网络隔离无法连接。

标准的做法是,通过配置文件后缀区分多环境,在启动项目时指定对应的环境值即可。比如 application-dev.yml 表示开发环境、application-prod.yml 表示生产环境。

7、强行合并或推送代码

我见过一些急性子的同学,在提交或推送代码的时候遇到了代码冲突,觉得麻烦就强行合并或推送了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 忽略代码冲突,强行合并
git merge branch-feature --strategy-option=theirs

# 强行推送,覆盖远程代码
git push --force

此举可谓图一时之快,但后患无穷矣。

很快你的同事就会找上门:我的码呢?

你的领导也会找上门:没通过审核的代码怎么就推到主分支了?

所以遇到代码冲突之后,一定要仔细处理冲突,不要强行合并或推送,除非你能接受这么做的最坏结果。

对于管理者,最好在代码管理平台中开启保护分支,禁止成员把未审核通过的代码直接推送到主分支。

8、提交敏感信息

很多朋友的数据保护意识是比较差的,尤其是刚接触 Git 代码提交的同学,可能一不小心,就把包含了数据库账号密码的配置文件提交到 GitHub 等开源平台了,开源精神令人感动。

不信的话,你可以在 GitHub 搜索和秘钥有关的关键词,一抓一大把。

我自己也经历过这事,曾经提供了一个免费的图床给编程导航的同学使用,结果有不止一个人把我的图床秘钥开源到了 GitHub 上。

好在有些大厂的云服务会自动检测你有没有将秘钥提交到开源平台,如果出现了,会给你发送邮件。

解决这个问题的方法也很简单,我们可以准备两套配置文件,一套开源,一套自用,在 Git 中忽略掉自用配置文件的提交即可。

OK 就分享到这里,大家还见过哪些常见的、或者 “有点儿东西” 的 Bug 呢?欢迎评论区分享~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-12-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员鱼皮 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Git 进阶技巧合集:这些操作 99% 的程序员都忽略了
结果项目一出冲突,git pull 直接硬合,最后代码全是“conflict_marker 地狱”。
Echo_Wish
2025/07/16
1690
Git 进阶技巧合集:这些操作 99% 的程序员都忽略了
腾讯程序员的Git大法:我是这样搞定分支的
很多读者看了《从9G到0.3G,腾讯会议对他们的git库做了什么?》之后,希望鹅厂程序员们分享更多 git 操作技巧。”git坑太多了“、”在工作中我经常遇到这个情况:忙了一天准备提交代码下班,结果 git 合并冲突把刚写好的代码覆盖掉了,血压飙升!““合并前文件还在的,合并后就不见了”,“我遇到 git 合并的 bug 了” ——这是程序员高频遇到的场景。鹅厂毕鸣一如何攻破这个 git 使用时的痛点?欢迎继续阅读。
腾讯云开发者
2023/08/03
4240
腾讯程序员的Git大法:我是这样搞定分支的
程序员遇到Bug时的30个反应
开发应用程序是一个非常有压力的工作。没有人是完美的,因此在这个行业中,代码中出现bug是相当普遍的现象。面对bug,一些程序员会生气,会沮丧,会心烦意乱,甚至会灰心丧气,而另一些程序员会依然保持冷静沉着。因此,如何处理修复bug的过程也值得我们细细琢磨。
哲洛不闹
2018/09/18
3960
有赞移动日志实践
日志系统,是移动端定位排查线上问题非常有效的一个工具。以往商家使用App出现问题,向客服咨询时,客服需要详细收集商家的问题信息、店铺信息(操作步骤、操作视频等),然后提交工单反馈给开发,开发再根据这些信息进行问题定位。这个过程中反复沟通的时间成本无法避免,商家与客服在沟通时也存在信息遗漏与缺失。随着业务的不断扩张,业务的复杂度不断加深,当用户达到一定的量级时,仅靠客服在商家和开发之间反复沟通,显然不能满足各个业务开发同学的需要,也无法快速定位问题。
有赞coder
2020/08/24
1.3K0
有赞移动日志实践
程序员遇到bug时常见的30种反应,你躺枪了么?
开发应用程序是一项压力很大的工作,人无完人,工作中遇到 bug 是很正常的事,有些程序员会生气,沮丧,郁闷,甚至泄气,也有一些程序员则会比较淡定。如何进行修复 bug 的过程,是值得我们好好推敲的。
IT阅读排行榜
2018/08/14
8930
程序员修炼之道 — DRY 原则
DRY(Don’t Repeat Yourself),翻译成中文就是,不要重复你自己。这个原则最早出现在经典著作《程序员修炼之道》里,定义是这样的:系统的每一个功能都应该有唯一的实现,如果多次遇到同样的问题,就应该抽象出一个共同的解决方法,而不要重复开发同样的功能代码。但是对于DRY原则,会比较容易陷入如下的一些思维陷阱中:
用户9914333
2022/12/14
6190
程序员修炼之道 — DRY 原则
拒绝"裸奔",SpringBoot集成Jasypt加密敏感信息
在互联网遍布社会各个角落的时代,伴随着的是安全问题总是层出不穷。 19年4月,根据深圳市人民检察院微信消息,深圳某知名无人机企业的工程师因为泄露公司源代码到开源社区Github上而造成了公司巨大的损失,最终被判处有期徒刑6个月,罚款20万元。
IT学习日记
2022/09/13
1.4K0
拒绝"裸奔",SpringBoot集成Jasypt加密敏感信息
架构设计---用户加密处理
在互联网各种安全问题中,最能引发话题,刺激大众神经的就是用户的泄密问题,数据库被拖库导致所有的数据泄露,这种系统安全问题涉及的因素可能有很多,大部分和开发软件的程序员没有关系,但是因为数据库被泄露,黑客直接获得了用户的密码等敏感问题,用户密码泄露就是程序员的问题了。
小马哥学JAVA
2023/02/27
7270
架构设计---用户加密处理
9102年的数据泄漏,裸奔的不只是你的个人信息 | Alfred数据
日前,疑似“陕西普通话成绩查询网(sxpth.cn)”由于网站的程序员把所有考生信息(包括照片、身份证、准考证号、院校等)通过硬编码的方式直接写进了网页源代码里,导致大量考生信息泄漏。
Alfred数据室
2019/11/10
9280
9102年的数据泄漏,裸奔的不只是你的个人信息 | Alfred数据
为什么说用 MD5 存储密码非常危险,这些你该清楚
很多软件工程师都认为 MD5 是一种加密算法,然而这种观点其实是大错特错并且十分危险的,作为一个 1992 年第一次被公开的算法,到今天为止已经被发现了一些致命的漏洞,我们在生产环境的任何场景都不应该继续使用 MD5 算法,无论是对数据或者文件的内容进行校验还是用于所谓的『加密』。
AlbertZhang
2021/02/25
1.4K0
程序员必须掌握的HTTP基本知识
HTTP 请求报文的构成 (GET/POST..) (/index) HTTP/1.1 协议 资源地址 http版本 (HOST: tzwlink.xyz) 域名 (userName=gre&age=21) 请求内容 例如 GET /blogart HTTP/1.1 HOST: tzwlink.xyz Connection: keep-alive name=great&age=21 响应报文的构成 (HTTP/1.1) (20
努力的Greatiga
2022/07/25
2740
该如何设计你的 PasswordEncoder?
来源:https://www.cnkirito.moe/spring-security-6
芋道源码
2019/10/29
1.6K0
该如何设计你的 PasswordEncoder?
Sourcetree使用教程
· 使用远程仓库的好处就是可以不同而地方不同的电脑直接拉取项目开发,开发完提交就行了
sunonzj
2022/06/21
5.4K0
Sourcetree使用教程
为什么我总写 Bug ?
写代码的过程中,难免会出现各种各样的 Bug。但实际上,很多 Bug 产生的原因是类似的。于是我总结了一些自己学编程时写 Bug 的诱因,希望大家引以为戒,在以后写代码的时候能更多注意。
程序员鱼皮
2021/09/15
7490
程序员必须要掌握的 Git 操作技巧
原文链接:https://juejin.im/post/5d157bf3f265da1bcc1954e6
业余草
2019/09/19
7780
程序员必须要掌握的 Git 操作技巧
最令程序员沮丧的 10 件事
软件开发是一个伟大的工作——和任何其他工作一样,它也有它的缺点。下面的10件事就是大多数程序员关于编程所无法苟同的。
哲洛不闹
2018/09/14
3880
最令程序员沮丧的 10 件事
GitHub告急!黑客威胁程序员不交钱就删库
5月3日,当中国程序员正愉快地过五一节时,国外程序员突然发现自己GitHub上的代码不翼而飞!自己的GitHub一秒变成悬疑片现场,不仅被黑客攻击删代码了,嚣张的黑客还留下一封勒索信:
AI科技大本营
2019/05/15
7490
GitHub告急!黑客威胁程序员不交钱就删库
给新手程序员的25个建议
但后来发现,有些两年之前的代码,业务逻辑都忘了,有些代码自己都看不懂。特别是有部分非常复杂的逻辑和算法,需要重新花很多时间才能看明白,可以说自己把自己坑了。
苏三说技术
2023/10/25
5841
Git版本控制之多人协作
Single
2018/01/04
1.2K0
Git版本控制之多人协作
程序员遇到 Bug 时的 30 个反应,你是哪一种?
来源:techug.com http://www.techug.com/post/programmer-reaction-with-30-bugs.html 开发应用程序是一个非常有压力的工作。没有人是完美的,因此在这个行业中,代码中出现bug是相当普遍的现象。面对bug,一些程序员会生气,会沮丧,会心烦意乱,甚至会灰心丧气,而另一些程序员会依然保持冷静沉着。因此,如何处理修复bug的过程也值得我们细细琢磨。 我想分享一些程序员修复他们的源代码时所经历的想法。这是事情变得紧张时所触发的轻松幽默。通常说来,应
前端教程
2018/03/05
1.3K0
程序员遇到 Bug 时的 30 个反应,你是哪一种?
相关推荐
Git 进阶技巧合集:这些操作 99% 的程序员都忽略了
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档