ChatGPT帮我看下这段代码有什么问题.docx

ChatGPT帮我看下这段代码有什么问题.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

ChatGPT帮我看下这段代码有什么问题

本文G/niumoo/JavaNotes和未读代码博客已经收录,有很多系列文章。

今天一个很简单的功能,触发了一个BUG,处理后我想起了最近爆火的ChatGPT,于是我尝试测试ChatGPT能否发现这个BUG。这篇文章会先介绍功能代码,然后手动分析BUG原因;接着测试ChatGPT能否发现这个BUG。

先说下结论,测试结束,ChatGPT今后可能是我编程路上的好帮手。

今天在测试一个准备上线的新功能时,里面有一段简单的函数,出现了一个BUG。我先说一下这个函数的功能,看下你会怎么写。

功能描述

输入:一个文件夹路径。

输出:这个文件夹中的文件夹数量。

这是一个实现起来比较简单的函数,我顺手写了下面的代码:

StringpathString=/Users/darcy/

FilefileDir=newFile(pathString);

if(!fileDir.exists()||!fileDir.isDirectory()){

thrownewRuntimeException(xxx....

String[]fileList=fileDir.list();

intcount=0;

for(StringfilePath:fileList){

if(newFile(pathString+filePath).isDirectory()){

count++;

System.out.println(count);

功能是实现了,但是很明显,代码比较繁琐,于是我又顺手优化了一下。

Pathpath=Paths.get(/Users/darcy/

if(!Files.exists(path)||!Files.isDirectory(path)){

thrownewRuntimeException(xxx....

longdirCount=Files.list(path).filter(Files::isDirectory).count();

System.out.println(dirCount);

效果是一样的,因为使用了JDK7引入的Files类,让代码简单了不少。

不过正是这段代码,触发了BUG,我先卖个关子,你先看下BUG在什么地方。

你看出问题了吗?改造后的代码运行少量次数的情况下,都是可以正常输出的。但是它有一个问题,就是Files.list返回的Stream流没有进行关闭,这就导致如果这段代码被频繁的调用,一段时间后将会因为打开的文件过多而报错,可以测试出这种异常情况。

在循环中不断运行这段代码:

while(true){

Pathpath=Paths.get(/Users/darcy/

if(!Files.exists(path)||!Files.isDirectory(path)){

thrownewRuntimeException(xxx....

longdirCount=Files.list(path).filter(Files::isDirectory).count();

System.out.println(dirCount);

}

一段时间后控制台收到报错:Toomanyopenfiles

报错的原因是因为每个进程可以打开的文件数量是有限制的,如果一直打开不进行关闭,在达到限制时会报出这个错误。

不妨让代码运行速度降低,然后监控下随着程序的运行,运行进程持有的文件数是否不断增加。

while(true){

Pathpath=Paths.get(/Users/darcy/

if(!Files.exists(path)||!Files.isDirectory(path)){

thrownewRuntimeException(xxx....

longdirCount=Files.list(path).filter(Files::isDirectory).count();

System.out.println(dirCount);

Thread.sleep(1000);

}

下面是用到的命令。

##查找进程ID

?~jps-mlVv|grep

文档评论(0)

152****2468 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档