• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

java.lang.ArrayIndexOutOfBoundsException: 1 - jak zlokalizować i usunąć problem?

VPS Starter Arubacloud
0 głosów
309 wizyt
pytanie zadane 7 października 2017 w Java przez zygmunt Początkujący (310 p.)

Przepisałem sobie taki o to przykład z książki, jednak występuje w nim błąd, którego nie potrafię zlokalizować i naprawić:

package tripledes;

import javax.crypto.*;
import javax.crypto.spec.*;
import java.security.*;
import java.security.spec.*;
import java.io.*;

public class TripleDES {

    public static void main(String[] args) {

        try {
            try {
                Cipher c = Cipher.getInstance("DESede");
            } catch (Exception e) {
                System.err.println("Installing SunJCE provicer");
                Provider sunjce = new com.sun.crypto.provider.SunJCE();
                Security.addProvider(sunjce);
            }

            File keyfile = new File(args[1]);

            if (args[0].equals("-g")) {
                System.out.println("Generating key. This may take some time...");
                System.out.flush();
                SecretKey key = generateKey();
                writeKey(key, keyfile);
                System.out.println("Done");
                System.out.println("Secret key written to " + args[1] + ". Protect that file!");
            } else if (args[0].equals("-e")) {
                SecretKey key = readKey(keyfile);
                encrypt(key, System.in, System.out);
            } else if (args[0].equals("-d")) {
                SecretKey key = readKey(keyfile);
                decrypt(key, System.in, System.out);
            }
        } catch (Exception e) {
            System.err.println(e);
            System.err.println("Usage: java " + TripleDES.class.getName() + "-d|-e|-g <keyfile>");
        }

    }

    public static SecretKey generateKey() throws NoSuchAlgorithmException {
        KeyGenerator keygen = KeyGenerator.getInstance("DESede");
        return keygen.generateKey();
    }

    public static void writeKey(SecretKey key, File f) throws IOException, NoSuchAlgorithmException, InvalidKeySpecException {
        SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("DESede");
        DESedeKeySpec keyspec = (DESedeKeySpec) keyfactory.getKeySpec(key, DESedeKeySpec.class);
        byte[] rawkey = keyspec.getKey();

        FileOutputStream out = new FileOutputStream(f);
        out.write(rawkey);
        out.close();
    }

    public static SecretKey readKey(File f) throws IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidKeySpecException {
        DataInputStream in = new DataInputStream(new FileInputStream(f));
        byte[] rawkey = new byte[(int) f.length()];
        in.readFully(rawkey);
        in.close();

        DESedeKeySpec keyspec = new DESedeKeySpec(rawkey);
        SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("DESede");
        SecretKey key = keyfactory.generateSecret(keyspec);
        return key;
    }

    public static void encrypt(SecretKey key, InputStream in, OutputStream out)
            throws NoSuchAlgorithmException, InvalidKeyException, NoSuchPaddingException, IOException {
        Cipher cipher = Cipher.getInstance("DESede");
        cipher.init(Cipher.ENCRYPT_MODE, key);

        CipherOutputStream cos = new CipherOutputStream(out, cipher);

        byte[] buffer = new byte[2048];
        int bytesRead;
        while ((bytesRead = in.read(buffer)) != -1) {
            cos.write(buffer, 0, bytesRead);
        }
        cos.close();

        java.util.Arrays.fill(buffer, (byte) 0);
    }

    public static void decrypt(SecretKey key, InputStream in, OutputStream out)
            throws NoSuchAlgorithmException, InvalidKeyException, IOException, IllegalBlockSizeException,
            NoSuchPaddingException, BadPaddingException {
        Cipher cipher = Cipher.getInstance("DESede");
        cipher.init(Cipher.DECRYPT_MODE, key);

        byte[] buffer = new byte[2048];
        int bytesRead;
        while ((bytesRead = in.read(buffer)) != -1) {
            out.write(cipher.update(buffer, 0, bytesRead));
        }
        out.write(cipher.doFinal());
        out.flush();
    }

}

 

1
komentarz 8 października 2017 przez mrcnsct Nałogowiec (36,390 p.)

Powinno Ci pokazać w której linii jest ten błąd. W poniższym przykładzie widać, że 4 linijka powoduje błąd.

package javaapplication;
public class JavaApplication {
    public static void main(String[] args) {
        System.out.println(args[1]);
    }
}
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
	at javaapplication.JavaApplication.main(JavaApplication.java:4)

Podaj całość błędu. Podejrzewam 22 linijkę. Czy podałeś argumenty wywołania programu? Jeśli nie to args ma długość 0, a Ty chcesz się dostać do args[1].

komentarz 12 października 2017 przez efiku Szeryf (75,160 p.)
edycja 12 października 2017 przez efiku
Przytoczę tylko wpis ze  stacka: https://stackoverflow.com/a/4998483

PS: Chłopie z jakiego ty zabytku się uczysz .. ;)

Błąd jest taki:

Error:(3, 22) java: package com.sun.crypto.provider is not visible
  (package com.sun.crypto.provider is declared in module java.base, which does not export it)
komentarz 16 października 2017 przez zygmunt Początkujący (310 p.)
Tak, błąd był w 22 linijce - nie podałem argumentu wywołania programu

1 odpowiedź

0 głosów
odpowiedź 12 października 2017 przez filozof71 Nowicjusz (220 p.)
Co nie wypisuje Ci stack trace? Który to jest Twój program?

Podobne pytania

0 głosów
1 odpowiedź 979 wizyt
pytanie zadane 29 stycznia 2017 w Java przez gab123 Mądrala (5,230 p.)
0 głosów
1 odpowiedź 911 wizyt
0 głosów
1 odpowiedź 708 wizyt
pytanie zadane 27 listopada 2018 w Java przez mn130496 Gaduła (3,530 p.)

92,453 zapytań

141,262 odpowiedzi

319,087 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...