1

Estoy intentando desarrollar un sistema de facturación.

El detalle al compilar; me arroja el famoso error ya mencionado.

Exception in thread "main" java.lang.NullPointerException at sun.misc.CharacterDecoder.decodeBuffer(CharacterDecoder.java:187) at timbrado.Timbrado.main(Timbrado.java:43) C:\Users\adminis\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1 BUILD FAILED (total time: 5 seconds)

La linea 43 es la siguiente:

if (connect.error) 
    {
      System.out.println(r);
    }
    else 
    {
      String xml = new String(new sun.misc.BASE64Decoder().decodeBuffer(connect.strXml));
      try {
          File archivo = new File(pathdir+"/resultados/ejemploXML_CFDI.xml"); //LINEA 43
          FileWriter escribir = new FileWriter(archivo);
          escribir.write(xml);
          escribir.close();
        }

Sé que esta pregunta ya esta repetida infinidades de veces, pero la vuelvo a realizar porque todos los casos son distintos al mio. Gracias.

Anexo código de mi Main:

package timbrado;

import java.io.*;
import wsconnectionfm.WSConecFM;

public class Timbrado33 {

    public static void main(String[] args) throws IOException {
    // TODO code application logic here
    WSConecFM connect = new WSConecFM();
    /* Configurar las variables de conexion
     * puede cambiar:
     * 1.- Url de conexion con soap
     * 2.- Usuario de conexion
     * 3.- Contraseña de Usuario
     * 4.- Indicar si desea generar el pdf
     * 5.- Indicar si desea generar el txt
     * 6.- Indicar si desea genera el cbb (Activarlo, desactiva generar pdf)
     */
    connect.setRfcEmisor("TUMG620310R95");
    String pathdir = System.getProperty("user.dir");

    /* EL parametro enviado al metodo timbrar puede ser:
     * un archivo xml, un layot txt o un string que contenga el xml
     */
    String r = connect.timbrar(pathdir+"/ejemplos/ejemploTimbrado33.xml");

    if (connect.error) {
      System.out.println(r);
    }
    else {
      String xml = new String(new sun.misc.BASE64Decoder().decodeBuffer(connect.strXml));
      try {
          File archivo = new File(pathdir+"/resultados/ejemploXML_CFDI33.xml");
          FileWriter escribir = new FileWriter(archivo);
          escribir.write(xml);
          escribir.close();
        }
        catch(Exception e) {
          System.out.println(e.getMessage().toString());
      }
      if (connect.generarPDF) {
        OutputStream out;
        try {
          byte[] b = new sun.misc.BASE64Decoder().decodeBuffer(connect.strPdf);
          out = new FileOutputStream(pathdir+"/resultados/ejemploPDF_CFDI33.pdf");
          out.write(b, 0, b.length);
          out.close();
        }catch (Exception e) {
          System.out.println(e);
        }
      }
      if (connect.generarCBB) {
        OutputStream out;
        try {
          byte[] b = new sun.misc.BASE64Decoder().decodeBuffer(connect.strCbb);
          out = new FileOutputStream(pathdir+"/resultados/ejemploCBB_CFDI33.png");
          out.write(b, 0, b.length);
          out.close();
        }catch (Exception e) {
          System.out.println(e);
        }
      }
      if (connect.generarTXT) {
        String txt = new String(new sun.misc.BASE64Decoder().decodeBuffer(connect.strTxt));
        try {
          File archivo = new File(pathdir+"/resultados/ejemploTXT_CFDI33.txt");
          FileWriter escribir = new FileWriter(archivo);
          escribir.write(txt);
          escribir.close();
        }
        catch(Exception e) {
          System.out.println(e.getMessage().toString());
        }
      }
      System.out.println(r);
      System.out.println("El comprobante lo encuentra en: "+pathdir+"/resultados/");
    }
  }

}
Ruslan López
  • 10,060
  • 11
  • 35
  • 68
Kangaroo
  • 11
  • 4
  • Da la sensación de que el error se deba a la variable connect esta vacía, podrías compartir el resto del código antes de la linea 43 (que asumo es if(connect.error)) – Rostan Aug 01 '17 at 16:33
  • 1
    No. Aunque no lo creas, todos los casos son el mismo. Si tenes un null pointer exception, tenes una variable en null, aunque pienses que no. Si connect no esta inicializada, entonces es null y tirara el error. mira https://es.stackoverflow.com/questions/42977/cu%C3%A1l-es-la-soluci%C3%B3n-a-todos-los-errores-nullpointerexception-presentes-pasados – gbianchi Aug 01 '17 at 16:36
  • Connect es un objeto que invoca a otra clase :/ – Kangaroo Aug 01 '17 at 16:42
  • Primero que nada encerraría el código dentro de un if(connect != null) así en el else mostrarías un sout con el mensaje de que realmente está null y descartas ciertas dudas, hazlo y dinos que obtienes. Saludos. – Rostan Aug 01 '17 at 16:54
  • `connect` no es null ya que entonces el error lo diera en `if(connect.error)`. El error esta en el metodo `decodeBuffer` como lo dice el stacktrace. Probablemente el metodo `BASE64Decoder#decodeBuffer` no acepte valores null. Valida que no este llegando null a ese metodo. – Einer Aug 01 '17 at 17:06
  • No arroja ningún Null, me he cerciorado de eso... Me causa dolor de cabeza ese tipo de errores. – Kangaroo Aug 01 '17 at 17:26
  • connect.strXml no es null? seguro? – gbianchi Aug 01 '17 at 17:36
  • No es null, estoy segurísimo – Kangaroo Aug 01 '17 at 19:10
  • Alguien ayúdeme – Kangaroo Aug 02 '17 at 18:59
  • Yo creo que el erro está en `new sun.misc.BASE64Decoder().decodeBuffer(connect.strXml)`, intenta mandar tu decodificador de base 64 a otra variable y verifica que no sea nulo – Ruslan López Dec 12 '18 at 08:17
  • 1
    Vamos a ser concretos y rigurosos: **1.** El error habla de la clase Timbrado y el código que muestras es de una clase llamada Timbrado33. **2.** El error sería en una línea donde usas `sun.misc.CharacterDecoder.decodeBuffer`, pero tu código usa `sun.misc.BASE64Decoder.decodeBuffer`. **3.** Un NPE **no** es un error de compilación, sino de ejecución. – Pablo Lozano Dec 12 '18 at 08:42

0 Answers0