我試圖從FTP順序下載兩個文件。首先下載文件沒有任何問題。但是當InputStream
用ftpClient.retrieveFileStream()
初始化時,第二次拋出NullPointerException。我試圖改變序列,但它沒有效果。文件存在並在FTP上可用。當我嘗試從FTP下載文件時引發NullPointerException
CODE
FTPClient ftpClient;
@Override
protected void onPreExecute() {
String server = "xxxxxxxxxxxxxxxxxxxxx";
int port = 21;
String user = "xxxxxx";
String pass = "xxxxxx";
long fileSize = 0;
try {
ftpClient = new FTPClient();
ftpClient.connect(server, port);
ftpClient.login(user, pass);
ftpClient.enterLocalPassiveMode();
fileSize += getFileSize(ftpClient, CARDS_DB);
fileSize += getFileSize(ftpClient, IMG_DB);
showDialog(PROGRESS_DLG_ID);
downloadProgress.setMax((int) fileSize);
} catch (Exception e) {
Log.e("ERROR", e.toString());
}
}
@Override
protected Boolean doInBackground(String... strings) {
final String PATH = getExternalCacheDir().toString() + "/";
int total = 0;
try {
downloadFile(ftpClient, PATH, CARDS_DB, total);
downloadFile(ftpClient, PATH, IMG_DB, total);
} catch (Exception e) {
Log.e("EXCEPTION", e.toString());
return false;
} finally {
try {
if (ftpClient.isConnected()) {
ftpClient.logout();
ftpClient.disconnect();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
return true;
}
private void downloadFile(FTPClient ftpClient, String PATH, String fileName, int total) {
try {
File downloadFile = new File(PATH + fileName);
OutputStream outputStream = new BufferedOutputStream(new FileOutputStream(downloadFile));
InputStream inputStream;
inputStream = ftpClient.retrieveFileStream(fileName); //here i have exception at second method invocation.
byte[] bytesArray = new byte[8192];
int bytesRead;
while ((bytesRead = inputStream.read(bytesArray)) != -1) {
total += bytesRead;
outputStream.write(bytesArray, 0, bytesRead);
publishProgress(total);
}
outputStream.close();
inputStream.close();
} catch (Exception ex) {
Log.d("ERROR", "Error: " + ex.getMessage());
ex.printStackTrace();
}
}
logcat的:
10-13 14:51:29.519 W/System.err(9554): java.lang.NullPointerException
10-13 14:51:29.529 W/System.err(9554): at com.FHS.ActivityMain$DBLoad.downloadFile(ActivityMain.java:170)
10-13 14:51:29.529 W/System.err(9554): at com.FHS.ActivityMain$DBLoad.doInBackground(ActivityMain.java:141)
10-13 14:51:29.529 W/System.err(9554): at com.FHS.ActivityMain$DBLoad.doInBackground(ActivityMain.java:102)
10-13 14:51:29.529 W/System.err(9554): at android.os.AsyncTask$2.call(AsyncTask.java:185)
10-13 14:51:29.529 W/System.err(9554): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
10-13 14:51:29.529 W/System.err(9554): at java.util.concurrent.FutureTask.run(FutureTask.java:138)
10-13 14:51:29.529 W/System.err(9554): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
10-13 14:51:29.529 W/System.err(9554): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
10-13 14:51:29.529 W/System.err(9554): at java.lang.Thread.run(Thread.java:1019)
解決 問題解決了。我只需要在每次調用方法downloadFile()時初始化FTPClient並在方法內部打開/關閉連接。
哪一行是'ActivityMain.java:170'? – ssantos
@ssantos - 他在源文件中註明了這一點 - 尋找評論 – kamituel
對,我的壞... – ssantos