0 0

这段代码如何重构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个答案 按时间排序 按投票排序

0 0

采纳的答案

其实楼上都说的是异常处理办法,给你一段代码:

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
0 0

可以把异常抛出去,在上一层调用时,统一处理
这样做就是不知道具体是那个处理上抛出了异常,提示信息不好打...

2013年6月13日 16:04
0 0

如果你使用的是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
0 0

你这异常抓的一点意义都没有 你可能天天看着后台或者天天看着日志去吗

出现异常要么自行处理掉 要么 抛给上层调用者

针对用户操作层抛出的异常 那么必须给予用户提示

2013年6月13日 15:24
0 0

(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
0 0

public static boolean connect(FTPClient fc, String ip) throws Exception{  
  fc.connect("127.0.0.1");  
 
交给要调用的地方处理,如果调用的地方,连接都出了异常,就直接不用调用别的方法了

2013年6月13日 12:54
0 0

如果不想太多catch语句块,你可以向上层抛,然后在最外层根据Exception的种类,进行不同的处理。

2013年6月13日 10:35
0 0

把上面的代码段放到一个方法中,如:

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
0 0

异常上抛 

2013年6月12日 21:33

相关推荐

    .java代码重构

    这个文件可能包含了一个关于代码重构的演示文稿,详细讲解了重构的相关理论、实践案例和技巧,对于深入理解和学习代码重构非常有帮助。 通过以上介绍,我们可以看出,代码重构是一个系统化的过程,需要结合多种...

    一本代码重构的书让代码更简洁

    例如,当发现一段代码在多个地方出现时,可以将其抽象为一个独立的函数或类,从而减少冗余,提高代码的复用性。同时,这种方法也有助于暴露隐藏的业务逻辑,使代码结构更加清晰。 在进行重构时,单元测试是不可或缺...

    java代码重构经验总结

    ### Java代码重构经验总结 在软件开发过程中,代码重构是一项重要的技能,它旨在不改变代码外部行为的前提下,改进其内部结构,从而提升代码质量和可维护性。本文将深入探讨Java代码重构的关键点,涵盖重构原则、...

    Java 代码重构实例

    如果一段代码在多个地方重复,那么将其封装到一个单独的方法中是个好主意,这有助于减少代码重复和提高可维护性。例如: 原始代码: ```java public boolean isStartAfter(Date date) {...} public boolean ...

    代码重构总结实例

    在这个"代码重构总结实例"中,我们将探讨一系列相关知识点,包括重构的原因、原则、方法以及相关的工具和实践。 1. **重构的原因**: - 代码异味:当代码出现冗余、复杂度过高或可读性差等问题时,重构有助于消除...

    看大师如何重构代码(java程序员必看)

    本文将深入探讨《看大师如何重构代码(java程序员必看)》这一主题,解析代码重构的核心概念、实践方法以及其对Java编程的深远影响。 ### 代码重构的概念 代码重构是指在不改变代码外部行为的前提下,对其内部结构...

    重构改善既有代码的设计PPT课件

    重构是软件开发过程中的一个重要环节,它关注于改善已有代码的设计,以提高代码的可读性和维护性,同时保持原有功能不变。通过重构,程序员能够更有效地管理代码,提升开发效率,减少错误,并促进团队成员之间的沟通...

    重构-改善既有代码的设计

    《重构-改善既有代码的设计》是一本专注于Java编程领域的经典著作,主要探讨了如何通过重构技术来提升既有代码的质量和可维护性。重构是软件开发过程中一个至关重要的环节,它旨在不改变代码外在行为的前提下,改进...

    代码审核和代码重构.pdf

    在现代软件开发过程中,代码审核和代码重构是两项至关重要的活动,它们对提高代码质量、维护性以及促进团队间的知识共享和技能提升有着不可估量的价值。代码审核是一种通过他人审查来提升代码质量的实践,而代码重构...

    重构 代码优化企业实战

    所谓代码优化是指对程序代码进行等价(指不改变程序的运行结果)变换。程序代码可以是中间代码(如四元...原则上,优化可以在编译的各个阶段进行,但最主要的一类是对中间代码进行优化,这类优化不依赖于具体的计算机。

    英文版(重构改善既有代码的设计)

    - **提取方法**(Extract Method):将一段代码从一个方法中提取出来成为一个新的独立方法,使其更加专注和简洁。 - **内联方法**(Inline Method):将一个方法调用替换为其实际实现的代码,从而消除不必要的方法...

    产品中的代码重构.pdf

    代码重构是软件开发过程中的重要环节,旨在提升代码的可读性和可维护性,而不会改变软件的功能。本文主要探讨了代码重构的相关理论和产品实战中的应用,涉及到多个重构方法。 首先,我们要理解重构的基本概念。重构...

    SourceMonitor 代码重构的小工具

    它可以帮助开发者理解和改进他们的代码库,通过提供详细的数据来支持代码重构决策。 **一、SourceMonitor的核心功能** 1. **代码复杂性测量**:SourceMonitor可以分析源代码的复杂性,包括函数的深度、循环和嵌套...

    软件重构 软件重构经典PPT

    这一概念由 Martin Fowler 在他的著作《重构:改善既有代码的设计》中进行了深入阐述。重构的过程是通过对代码进行一系列微小的改进,逐步改善其结构,以达到更高效、更易于理解和扩展的目标。 重构的关键在于它...

    软件工程中的代码重构与性能优化.pptx

    - 选取一段代码,展示如何通过应用上述重构方法,逐步提高其可维护性和可读性。 - 在实践中,根据具体情况进行适当的重构,以达到最佳的代码质量。 #### 第三章:性能优化技术 **性能调优的原则** - **找准性能...

    重构_改善既有代码的设计.pdf

    这是一种常见的重构技巧,涉及将一段代码提取到一个单独的方法中,并替换原始代码中的相应部分。这种方法可以提高代码的可读性和可维护性。 **移动功能(Move Function)**: 当某个类中的某些功能更适合另一个类时...

    重构_改善既有代码的设计

    为了应对这一挑战,《重构:改善既有代码的设计》这本书应运而生,成为软件工程领域的一部经典著作。 #### 二、书籍背景及重要性 1. **背景**: - 该书由著名的软件架构师Martin Fowler撰写,他不仅是敏捷软件...

Global site tag (gtag.js) - Google Analytics