-
这段代码如何重构0
有类似这么个代码:FTPClient fc = new FTPClient(); try { fc.connect("127.0.0.1"); } catch (SocketException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } //略去其他
在我程序中有类似大量这种try、catch出现,而且每次都要判断一下,如果没有异常就返回true,如果有异常就返回false,同时大多是这种fc.connect("127.0.0.1"),返回的是void类型的,本来想写个方法如:public static boolean xxx(void obj){里面是try、catch和判断},
然后调用如:Test.xxx(fc.connect("127.0.0.1")),然后如果连接成功则返回true,失败则返回false,最后我再根据结果做相应业务处理。
但是参数类型是不能为void的,那么该如何是好啊?如果每次都是try、catch及大量boolean判断,整个代码将相当冗余及逻辑混乱。
问题补充:大家可能没明白我的意思,都怪我,应该贴出全部代码的。其要求如下:
1、都要捕获异常,以便将来日志记录(坑爹的要求。。。还没完成)
2、connection连接失败,则再连3次,失败则结束,返回false,成功则继续
3、登录失败,处理异常并断开连接,成功继续
4、在服务端找不到要下载的文件,处理异常,并且关闭连接返回重新连接3次(坑爹的要求。。。还没完成),3次后还不行则返回false,正常则下好结束,关闭
代码如下:
package com.jftt.util;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.SocketException;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
public class DownLoadUtil {
/**
* Description: 从FTP服务器下载文件
* @author hebin
* @param url FTP服务器hostname
* @param port FTP服务器端口
* @param connectionTimes 连接次数
* @param timeOut 等待时间
* @param username FTP登录账号
* @param password FTP登录密码
* @param remotePath FTP服务器上的相对路径
* @param fileName 要下载的文件名
* @param localPath 下载后保存到本地的路径
* @return success
*/
public static boolean downFile(String url,int port,int connectionTimes,int timeOut,String username,String password,String remotePath,String fileName, String localPath){
//初始化,默认连接成功
boolean success = true;
//创建ftp客户端
FTPClient ftp = new FTPClient();
//定义失败后的连接次数为3
for (int i = 0; i < connectionTimes; i++) {
try {
//通过url和端口号连接ftp服务器
ftp.connect(url, port);
System.out.println("连接成功");
success = true;
i = connectionTimes + 1;
//成功连接则跳出for循环,失败则继续执行for循环
break;
} catch (SocketException e) {
e.printStackTrace();
System.out.println("连接失败");
} catch (IOException e) {
e.printStackTrace();
System.out.println("连接失败");
}
try {
//10秒未连上则中断连接
Thread.sleep(timeOut);
} catch (InterruptedException e) {
success=false;
e.printStackTrace();
}
}
try {
ftp.login(username, password);
System.out.println("登录成功");
success = true;
} catch (IOException e) {
e.printStackTrace();
System.out.println("登录失败");
success = false;
try {
ftp.logout();
ftp.disconnect();
} catch (IOException e1) {
System.out.println("关闭失败");
e1.printStackTrace();
}
}
int reply = 0;
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
try {
ftp.disconnect();
success = true;
} catch (IOException e) {
e.printStackTrace();
success = false;
}
return success;
}
try {
ftp.changeWorkingDirectory(remotePath);
} catch (IOException e) {
e.printStackTrace();
}
FTPFile[] fs;
try {
fs = ftp.listFiles();
for(FTPFile ff:fs){
String path = remotePath + HandleFileNameUtil.handleFileName(fileName);
//判断是否是主服务器文件路径
if(ff.getName().equals(path)){
//经过处理后的文件名
File localFile = new File(localPath+"/"+HandleFileNameUtil.handleFileName(fileName));
OutputStream is = new FileOutputStream(localFile);
ftp.retrieveFile(ff.getName(),is);
is.close();
ftp.logout();
ftp.disconnect();
success = true;
break;
}else{
success = false;
}
}
} catch (IOException e) {
System.out.println("文件不存在");
e.printStackTrace();
success = false;
}
return success;
}
}
问题补充:目前为了实现第四点坑爹的要求,我是这么做的(倒数第12行开始)(用了个递归):
else{
//找不到文件从头开始再来3次
for (int i = 0; i < connectionTimes; i++) {
downFile(url, port, connectionTimes, timeOut, username, password, remotePath, fileName, localPath);
}
success = false;
}2013年6月12日 18:34
9个答案 按时间排序 按投票排序
-
采纳的答案
其实楼上都说的是异常处理办法,给你一段代码:
public class DownLoadUtil { public static FTPClient open(String url, int port, int connectionTimes, int timeOut, String username, String password) throws IOException { FTPClient ftp = new FTPClient(); ftp.setConnectTimeout(timeOut); for (int i = 1;; i++) { try { ftp.connect(url, port); ftp.login(username, password); return ftp; } catch (IOException e) { if (i >= connectionTimes) throw e; } } } public static void close(FTPClient ftp) { if (ftp != null) { try { ftp.disconnect(); } catch (IOException e) { } } } public static void downFile(String url, int port, int connectionTimes, int timeOut, String username, String password, String remotePath, String fileName, String localPath) throws IOException { FTPClient ftp = null; try { ftp = open(url, port, connectionTimes, timeOut, username, password); ftp.changeWorkingDirectory(remotePath); FTPFile[] fs = ftp.listFiles(); for (FTPFile ff : fs) { String path = remotePath + HandleFileNameUtil.handleFileName(fileName); // 判断是否是主服务器文件路径 if (ff.getName().equals(path)) { // 经过处理后的文件名 File localFile = new File(localPath + "/" + HandleFileNameUtil.handleFileName(fileName)); try (OutputStream is = new FileOutputStream(localFile)) { ftp.retrieveFile(ff.getName(), is); } } } } finally { close(ftp); } } }
2013年6月14日 09:22
-
如果你使用的是JDK7,可以考如下建议:
1)如果确实应该捕获这些异常,并且两个异常处理方式都是相同的,可以使用Java7新加入的语法来处理:
catch(SocketException|IOException e) {
//处理代码
}
2)其实实际使用的过程中应该还有另外一个问题,就是需要处理的finally块,
比如
catch(SocketException|IOException e) {
//处理代码
} finally {
if(client!=null) {
client.close();
}
}
这个可以使你FTPClient实现AutoCloseable接口,这样就省去finally里面的麻烦了(finally里面的代码不做的话,有可能会造成连接泄露)。这个也是Java7里面的功能。2013年6月13日 15:52
-
你这异常抓的一点意义都没有 你可能天天看着后台或者天天看着日志去吗
出现异常要么自行处理掉 要么 抛给上层调用者
针对用户操作层抛出的异常 那么必须给予用户提示2013年6月13日 15:24
-
(1)如果出现SocketException,IOException的时候处理都是e.printStackTrace(),那应该就不用分开捕获了异常,没有实际意义;
(2)
Test.xxx(fc.connect("127.0.0.1")),这样写同样需要捕获异常,是不是可以考虑把fc.connect("127.0.0.1")放到Test.xxx方法的声明里,出现异常返回false,无异常返回true;
(3)常是否异往上抛可能决定于你对fc.coct("127.0.nne0.1")的错误处理机制,如果出现这种错误不需要继续运行后续代码,那么可以考虑直接向上抛出,如果向上抛出的异常类型对你的业务逻辑没有意义的话可以在Test.xxx方法中把异常转换为RuntimeException,可能方法的签名会简洁清晰一点。2013年6月13日 13:17
-
public static boolean connect(FTPClient fc, String ip) throws Exception{
fc.connect("127.0.0.1");
交给要调用的地方处理,如果调用的地方,连接都出了异常,就直接不用调用别的方法了2013年6月13日 12:54
-
把上面的代码段放到一个方法中,如:
public static boolean connect(FTPClient fc, String ip) { try { fc.connect("127.0.0.1"); return true; } catch (SocketException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (NullPointerException npe) { npe.printStackTrace(); } return false; }
上面代码块的缺点就是不知道发生了何种异常。建议你自定义一个异常类,然后设置异常编码,把上面可能发生的异常定义成相应的编码,然后抛到上层2013年6月13日 08:52
相关推荐
这个文件可能包含了一个关于代码重构的演示文稿,详细讲解了重构的相关理论、实践案例和技巧,对于深入理解和学习代码重构非常有帮助。 通过以上介绍,我们可以看出,代码重构是一个系统化的过程,需要结合多种...
例如,当发现一段代码在多个地方出现时,可以将其抽象为一个独立的函数或类,从而减少冗余,提高代码的复用性。同时,这种方法也有助于暴露隐藏的业务逻辑,使代码结构更加清晰。 在进行重构时,单元测试是不可或缺...
### Java代码重构经验总结 在软件开发过程中,代码重构是一项重要的技能,它旨在不改变代码外部行为的前提下,改进其内部结构,从而提升代码质量和可维护性。本文将深入探讨Java代码重构的关键点,涵盖重构原则、...
如果一段代码在多个地方重复,那么将其封装到一个单独的方法中是个好主意,这有助于减少代码重复和提高可维护性。例如: 原始代码: ```java public boolean isStartAfter(Date date) {...} public boolean ...
在这个"代码重构总结实例"中,我们将探讨一系列相关知识点,包括重构的原因、原则、方法以及相关的工具和实践。 1. **重构的原因**: - 代码异味:当代码出现冗余、复杂度过高或可读性差等问题时,重构有助于消除...
本文将深入探讨《看大师如何重构代码(java程序员必看)》这一主题,解析代码重构的核心概念、实践方法以及其对Java编程的深远影响。 ### 代码重构的概念 代码重构是指在不改变代码外部行为的前提下,对其内部结构...
重构是软件开发过程中的一个重要环节,它关注于改善已有代码的设计,以提高代码的可读性和维护性,同时保持原有功能不变。通过重构,程序员能够更有效地管理代码,提升开发效率,减少错误,并促进团队成员之间的沟通...
《重构-改善既有代码的设计》是一本专注于Java编程领域的经典著作,主要探讨了如何通过重构技术来提升既有代码的质量和可维护性。重构是软件开发过程中一个至关重要的环节,它旨在不改变代码外在行为的前提下,改进...
在现代软件开发过程中,代码审核和代码重构是两项至关重要的活动,它们对提高代码质量、维护性以及促进团队间的知识共享和技能提升有着不可估量的价值。代码审核是一种通过他人审查来提升代码质量的实践,而代码重构...
所谓代码优化是指对程序代码进行等价(指不改变程序的运行结果)变换。程序代码可以是中间代码(如四元...原则上,优化可以在编译的各个阶段进行,但最主要的一类是对中间代码进行优化,这类优化不依赖于具体的计算机。
- **提取方法**(Extract Method):将一段代码从一个方法中提取出来成为一个新的独立方法,使其更加专注和简洁。 - **内联方法**(Inline Method):将一个方法调用替换为其实际实现的代码,从而消除不必要的方法...
代码重构是软件开发过程中的重要环节,旨在提升代码的可读性和可维护性,而不会改变软件的功能。本文主要探讨了代码重构的相关理论和产品实战中的应用,涉及到多个重构方法。 首先,我们要理解重构的基本概念。重构...
它可以帮助开发者理解和改进他们的代码库,通过提供详细的数据来支持代码重构决策。 **一、SourceMonitor的核心功能** 1. **代码复杂性测量**:SourceMonitor可以分析源代码的复杂性,包括函数的深度、循环和嵌套...
这一概念由 Martin Fowler 在他的著作《重构:改善既有代码的设计》中进行了深入阐述。重构的过程是通过对代码进行一系列微小的改进,逐步改善其结构,以达到更高效、更易于理解和扩展的目标。 重构的关键在于它...
- 选取一段代码,展示如何通过应用上述重构方法,逐步提高其可维护性和可读性。 - 在实践中,根据具体情况进行适当的重构,以达到最佳的代码质量。 #### 第三章:性能优化技术 **性能调优的原则** - **找准性能...
这是一种常见的重构技巧,涉及将一段代码提取到一个单独的方法中,并替换原始代码中的相应部分。这种方法可以提高代码的可读性和可维护性。 **移动功能(Move Function)**: 当某个类中的某些功能更适合另一个类时...
为了应对这一挑战,《重构:改善既有代码的设计》这本书应运而生,成为软件工程领域的一部经典著作。 #### 二、书籍背景及重要性 1. **背景**: - 该书由著名的软件架构师Martin Fowler撰写,他不仅是敏捷软件...