Исключение в потоке "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0 - PullRequest
1 голос
/ 22 марта 2012

в этой программе я получаю индекс массива из привязанного исключения, и я не мог знать, где это происходит. Эта программа извлекает данные из изображения, уже сохраненного какой-то другой программой (Encrypt.java здесь не объясняется). спасибо за вашу помощь

import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.*;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.math.BigInteger;


public class Decrypt extends JFrame {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    public static void main(String[] args) throws Exception {
    new Decrypt();
    }

    public Decrypt() throws Excenter code hereeption {
    setTitle("Color");
    setSize(300, 300);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(3);

    add(new PaintPanel(ImageIO.read(new File("src/outputImages/s2.bmp"))));
    setVisible(true);
    }

    class PaintPanel extends JPanel {

    /**
         * 
         */
        private static final long serialVersionUID = 1L;
    private BufferedImage image;

    PaintPanel(BufferedImage image) {
        this.image = image;
    }

    public void paintComponent(Graphics g) {
        File file = new File("src/input.txt");
        int length=0, insertCounter;
        String strFileContent="";
        try {
        //create FileInputStream object
        FileInputStream fin = new FileInputStream(file);

        /*
         * Create byte array large enough to hold the content of the file.
         * Use File.length to determine size of the file in bytes.
         */


        byte fileContent[] = new byte[(int)file.length()];

        /*
         * To read content of the file in byte array, use
         * int read(byte[] byteArray) method of java FileInputStream class.
         *
         */
        fin.read(fileContent);

        //create string from byte array
            strFileContent = new String(fileContent);

        System.out.println("File content : "+ strFileContent );

        BigInteger bi = new BigInteger(fileContent);
        // Format to binary
        strFileContent = bi.toString(2);      // 100100000111111110000
        length=strFileContent.length();      //thia variable contains the length of binary string
        //System.out.println(length+" File content in binary: "+ strFileContent );
        }
        catch(Exception e){
        System.out.println("File not found" + e);
        }

        File file1 = new File("input.txt");
        byte outputBytes[] = new byte[(int)file1.length()];
        insertCounter=0;
        int localCounter=0;
        byte tempbyte=0x00;
        for (int h = 0; h <=image.getHeight()-3; h=h+3) {
        for (int w = 0; w <=image.getWidth()-3; w=w+3) {
            int whiteParity=0;
            for(int i=0;i<3;i++){
            for(int j=0;j<3;j++){
                int rgb = image.getRGB(w+j,h+ i);     
                if (rgb == -1)
                whiteParity++;
            }
            }
            /* if(WhitePArity==1 ||WhitePArity==3 ||WhitePArity==5 ||WhitePArity==7 ||WhitePArity==9){

               }*/

            if( image.getRGB(w+1,h+1)==-1){
            if(localCounter==0)
                tempbyte=(byte)(tempbyte|0x80);
            if(localCounter==1)
                tempbyte=(byte)(tempbyte|0x40);
            if(localCounter==2)
                tempbyte=(byte)(tempbyte|0X20);
            if(localCounter==3)
                tempbyte=(byte)(tempbyte|0x10);
            if(localCounter==4)
                tempbyte=(byte)(tempbyte|0x08);
            if(localCounter==5)
                tempbyte=(byte)(tempbyte|0x04);
            if(localCounter==6)
                tempbyte=(byte)(tempbyte|0x02);
            if(localCounter==7)
                tempbyte=(byte)(tempbyte|0x01);
            }
            localCounter++;

            if(localCounter==8){
            outputBytes[insertCounter]=tempbyte;
            insertCounter++;
            localCounter=0;
            tempbyte=(byte)(tempbyte & 0x00);
            }


        }

        String outputString=new String(outputBytes);
        String strFilePath = "output.txt";

        try{
            FileWriter fstream = new FileWriter(strFilePath);
            BufferedWriter out = new BufferedWriter(fstream);
            out.write(outputString);
            //Close the output stream
            out.close();
        }
        catch(Exception e){
            System.out.println("File not found" + e);
        }

        }

        g.drawImage(image, 0, 0, this);
    }
    }
}

1 Ответ

3 голосов
/ 22 марта 2012

Я вижу в вашем коде два массива:

byte fileContent[] = new byte[(int)file.length()];

и:

byte outputBytes[] = new byte[(int)file1.length()];

Размеры обоих массивов основаны на вызове File.length()

FromJavaDoc для Файл :

Длина в байтах файла, обозначенного этим абстрактным путем, или 0L, если файл не существует.Некоторые операционные системы могут возвращать 0L для имен путей, обозначающих зависящие от системы объекты, такие как устройства или каналы.

Поэтому я предполагаю, что один из этих файлов либо пуст, либо не существует.

(Это поможет диагностировать проблему более решительно, если вы разместите полную трассировку стека, а не только сообщение об исключении).

...