0

quiero ver si me ayudan a ver porque me da este error, si todo de mi punto de vista lo veo correcto, pero me señala un puntero nulo. Acá el código que estoy probando.

El null me lo marca en el if

    public static void ListaDoc(String pUser, String pPass,String pHost, int pPort, String remotepath)
        throws Exception {

    JSch sftp = new JSch();
    // Instancio el objeto session para la transferencia
    Session session = null;
    // instancio el canal sftp
    ChannelSftp channelSftp = null;

    try {
        // Inciciamos el JSch con el usuario, host y puerto
        session = sftp.getSession(pUser, pHost, pPort);
        // Seteamos el password
        session.setPassword(pPass);
        // El SFTP requiere un intercambio de claves
        // con esta propiedad le decimos que acepte la clave
        // sin pedir confirmación
        Properties prop = new Properties();
        prop.put("StrictHostKeyChecking", "no");
        session.setConfig(prop);
        session.connect();

        // Abrimos el canal de sftp y conectamos
        channelSftp = (ChannelSftp) session.openChannel("sftp");
        channelSftp.connect();

        channelSftp.ls(remotepath);

    } catch (SftpException e) {
        throw new Exception(e);
    } catch (JSchException e) {
        throw new Exception(e);
    } finally {
        // Cerramos el canal y session
        if (channelSftp.isConnected()) {  // <--- Línea 71
            channelSftp.disconnect();}

        if (session.isConnected()){
            session.disconnect();}
    }// end finally
}// end ListaDoc

public static void main(String[] args) throws Exception{
   Descargar(USERNAME, PASSWORD, HOST, PORT, LOCALPATH, REMOTEPATH,FILE); // <-- Linea 121
} // End main

________________________________________________________________________________Mensaje de error enviado por netbeans 6.5 run:

Exception in thread "main" java.lang.NullPointerException at sftpbpm.Main.Descargar(Main.java:71) at sftpbpm.Main.main(Main.java:121) Java Result: 1 BUILD SUCCESSFUL (total time: 0 seconds)

Ruslan López
  • 10,060
  • 11
  • 35
  • 68
  • 1
    Bienvenido a SOe. Revisa esta pregunta sobre NullPointerException: https://es.stackoverflow.com/questions/42977/cu%c3%a1l-es-la-soluci%c3%b3n-a-todos-los-errores-nullpointerexception-presentes-pasados/. En todo caso a) hay dos `if`, así que no queda claro que línea falla b) no hay stacktrace, así que no hay forma de saber si el fallo es interno a la llamada al método y c) es en un finally y no hay forma de saber si se llegó a él normalmente (sin excepción) o a través del handler de una excepción que se lanzó, deberías depurar el programa algo más y averiguar en detalle qué pasa. – SJuan76 Aug 27 '17 at 23:59
  • Para futuros errores, dado que el reporte de errores en Java te tira tantas líneas que te pierdes, busca siempre en el reporte de errores la parte donde dice `Caused by....` en esa línea y las subsiguientes te dirá exactamente la línea del error y su causa. Si posteas eso junto con la pregunta será más fácil para ti y para otros saber dónde está el error. – A. Cedano Aug 28 '17 at 00:08
  • Disculpas del caso el fallo es en el primer if en el de valida si el channelsftp esta conectado. Esto es lo que envia al ejecutar el código. run: Exception in thread "main" java.lang.NullPointerException at sftpbpm.Main.Descargar(Main.java:71) at sftpbpm.Main.main(Main.java:121) Java Result: 1 BUILD SUCCESSFUL (total time: 0 seconds) – Carlos Cascante Aug 28 '17 at 00:17
  • Sugiero que **[edites la pregunta](https://es.stackoverflow.com/posts/97788/edit)** colocando al final el mensaje de error completo que estás recibiendo. Y si pudieras indicas cuáles son las líneas 71 y 121 de tu clase `Main`, mucho mejor. – A. Cedano Aug 28 '17 at 00:35
  • Listo ya agregue unos cuantos detalles sugeridos. – Carlos Cascante Aug 28 '17 at 02:38
  • 3
    ¿Responde esto a tu pregunta? [Error en Java con netbeans](https://es.stackoverflow.com/questions/288685/error-en-java-con-netbeans) – Ruslan López Oct 03 '20 at 21:14

2 Answers2

0

Buenas, viendo tu código parece que el problema no tiene por qué estar en el if, también puede estar en las líneas donde abres el canal:

ChannelSftp channelSftp = null; //aquí lo inicializas como null
try {
    // Abrimos el canal de sftp y conectamos
    channelSftp = (ChannelSftp) session.openChannel("sftp"); //aquí
    channelSftp.connect();
    //.....
    }
    //CATCHS
    finally
    {
         // Cerramos el canal y session
         if (channelSftp.isConnected()) {  // <--- Línea 71
         channelSftp.disconnect();}
    }

El código de finallyse va a ejecutar tanto si ocurre una excepción como si no. Si por algún motivno no se ha podido abrir el canal con la línea channelSftp = (ChannelSftp) session.openChannel("sftp");, tu variable channelSftpserá null (ya que así la inicializaste) por lo que en el finally no podrás llamar al método isConnected().

Revisa que que tanto channelSftp como session no son null.

DanielGS
  • 912
  • 5
  • 9
  • Hola #DanielGS correcto lo inicializo para poder crear las variables del tipo de canal y de sesion, si yo envió un print para enviar el valor de cada uno me da un true, puesto una vez ingresado al try se crea la sesión y se abre el canal. Incluso si elimino los if me da el mismo error. – Carlos Cascante Aug 28 '17 at 14:37
  • ¿Podrías postear el código completo para ayudarte mejor? – DanielGS Aug 28 '17 at 21:49
  • Listo ya esta el código completo. Por el momento solo llamo un método. – Carlos Cascante Aug 29 '17 at 00:06
  • Parece que el error no es en tu método (ListaDoc) sino en el método (Descargar. Revisa que que tanto **channelSftp** como **session** no son **null** en ese método y asegurate de que las líneas 71 y 121 son las que indicaste. – DanielGS Aug 29 '17 at 08:33
  • Hola el código es funcional en la versión 8 de netbeans, pero donde necesito aplicarlo no es compatible con esa versión solo me permite versión 6 de java. Tanto método ListaDoc y Descargar si los invoco en el main, me señalan puntero nullo en el if. pero esto solo en versión 6t de netbeans. Que es la que necesito complilar. – Carlos Cascante Aug 29 '17 at 15:03
0

import com.jcraft.jsch.ChannelSftp; import com.jcraft.jsch.JSch; import com.jcraft.jsch.JSchException; import com.jcraft.jsch.Session; import com.jcraft.jsch.SftpException; import java.io.BufferedOutputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.OutputStream; import java.util.Properties;

/** * * @author ccascante */ public class Main {

static final String USERNAME = "mobile";
static String HOST = "201.218.222.7";
static int PORT = 55507;
static String PASSWORD = "transferencias2$";
static String REMOTEPATH ="/mobile/java/";/*Agregar el working file para la descarga*/
static String LOCALPATH="C:/Cargar/SFTP/";/*Agregar el working file para la descarga*/
static String FILE="Avellanas.bmp";/*Archivo que deseamos descargar*/


public static void Descargar(String pUser, String pPass,String pHost, int pPort, String localpath, String remotepath, String file)
        throws Exception {
    JSch sftp = new JSch();
    // Instancio el objeto session para la transferencia
    Session session = null;
    // instancio el canal sftp
    ChannelSftp channelSftp = null;
    try {
        // Inciciamos el JSch con el usuario, host y puerto
        session = sftp.getSession(pUser, pHost, pPort);
        // Seteamos el password
        session.setPassword(pPass);
        // El SFTP requiere un intercambio de claves
        // con esta propiedad le decimos que acepte la clave
        // sin pedir confirmación
        Properties prop = new Properties();
        prop.put("StrictHostKeyChecking", "no");
        session.setConfig(prop);
        session.connect();

        // Abrimos el canal de sftp y conectamos
        channelSftp = (ChannelSftp) session.openChannel("sftp");
        channelSftp.connect();
        System.out.println( ""+channelSftp.isConnected());
        // Convertimos el archivo a transferir en un OutputStream donde se va a guardar
        OutputStream os = new BufferedOutputStream(new FileOutputStream(
                localpath+'/'+file));
        // Iniciamos la transferencia
        channelSftp.get(remotepath+'/'+file, os);
    } catch (JSchException e) {
        throw new Exception(e);
    } catch (SftpException e){
        throw new Exception(e);
    } catch (FileNotFoundException e){
        throw new Exception(e);
    }finally{
    // Cerramos el canal y session
        if (channelSftp.isConnected())
            channelSftp.disconnect();
        if (session.isConnected())
            session.disconnect();
    }// end finally
}// end Descargar


    public static void ListaDoc(String pUser, String pPass,String pHost, int pPort, String remotepath)
        throws Exception {
    JSch sftp = new JSch();
    // Instancio el objeto session para la transferencia
    Session session = null;
    // instancio el canal sftp
    ChannelSftp channelSftp = null;

    try {
        // Inciciamos el JSch con el usuario, host y puerto
        session = sftp.getSession(pUser, pHost, pPort);
        // Seteamos el password
        session.setPassword(pPass);
        // El SFTP requiere un intercambio de claves
        // con esta propiedad le decimos que acepte la clave
        // sin pedir confirmación
        Properties prop = new Properties();
        prop.put("StrictHostKeyChecking", "no");
        session.setConfig(prop);
        session.connect();

        // Abrimos el canal de sftp y conectamos
        channelSftp = (ChannelSftp) session.openChannel("sftp");
        channelSftp.connect();

        channelSftp.ls(remotepath);

    } catch (SftpException e) {
        throw new Exception(e);
    } catch (JSchException e) {
        throw new Exception(e);
    } finally {
        // Cerramos el canal y session
        if (channelSftp.isConnected())
            channelSftp.disconnect();
        if (session.isConnected())
            session.disconnect();
    }// end finally
}// end ListaDoc

public static void main(String[] args) throws Exception{
        Descargar(USERNAME, PASSWORD, HOST, PORT, LOCALPATH, REMOTEPATH,FILE);
} // End main

}