前提・実現したいこと
現在、ゲームを作成していて、その再画像の暗号化を行っていました。
実際にプログラムを動かした時エラーが出たため、System.out.println
でなぜかを調べていたところ、
split()関数を実行したあとの配列が空なことがわかりました。
発生している問題・エラーメッセージ
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1 at myrpg.main.FileIO.ImageChange(FileIO.java:63) at myrpg.main.MyGUI.main(MyGUI.java:42)
該当のソースコード
Java
1package myrpg.main; 2 3import java.io.*; 4 5import java.util.ArrayList; 6 7public final class FileIO 8{ 9 /* 10 * f には変換したいファイルを入れる 11 */ 12// デバッグとして img/char_p_hero01.amp というパスで File を入れてみた 13 public static void ImageChange( File f ) 14 { 15 ArrayList<Byte> data = new ArrayList<Byte>( 1 ); 16 17 short bdata; // 一時的にデータを保存(Buffer data) 18 19 try{ 20 FileInputStream fistream = new FileInputStream( f ); // ファイルのバイトを読む準備 21 22 for( int l = 0; ( bdata = (short)fistream.read() ) != -1; l++ ) data.add( (byte)bdata ); 23 }catch( IOException ie ){ 24 ie.printStackTrace(); 25 } 26 27 for( int l = 0; l < data.size(); l++ ){ 28 byte not = (byte)~data.get( l ); // 値をビットごとに反転 29 30 data.remove( l ); 31 data.add( l, not ); // 値を削除しその位置に設置 -> 置き換え 32 } 33 34 byte copy = data.get( data.size() - 1 ); // 最初と最後を入れ替える 35 data.remove( data.size() - 1 ); 36 data.add( data.get( 0 ) ); 37 data.remove( 0 ); 38 data.add( 0, copy ); 39 40 String bpath = f.getPath(); 41 String[] paths = bpath.split( File.separator ); 42 43 System.out.println( bpath ); // img/char_p_hero01.amp 44 for( int l = 0; l < paths.length; l++ ){ 45 System.out.println( paths[ l ] ); // img (改行) char_p_hero01.amp 46 } 47 48 String path = ""; 49 for( int l = 0; l < paths.length - 1; l++ ){ 50 path += paths[ l ]; 51 path += File.pathSeparator; 52 } 53 54 String fname = paths[ paths.length - 1 ]; 55 String[] filenames = fname.split( "." ); 56 57 System.out.println( "fname:" + fname ); // fname:char_p_hero01.amp 58 for( int l = 0; l < filenames.length; l++ ){ 59 System.out.println( "filenames[" + l + "]" + filenames[ l ] ); // 一切表示されない 60 } 61 62 if( filenames.length == 2 ){ // aaa.bb なら 63 filenames[ 1 ] = ".rbi"; 64 }else if( filenames.length == 1 ){ // aaa なら 65 filenames[ 0 ] += ".rbi"; 66 }else{ // aaa.bb.cc などなら 67 filenames[ filenames.length - 1 ] = ".rbi"; // エラー箇所 68 } 69 70 for( int l = 0; l < filenames.length; l++ ){ 71 path += filenames[ l ]; 72 } 73 74 byte[] rbisdata = { (byte)0xF0, (byte)0x00, (byte)0x15, (byte)0xFF, (byte)0x55 }; // .rbiを示すデータ 75 76 try{ 77 FileOutputStream fostream = new FileOutputStream( new File( path ) ); 78 79 fostream.write( rbisdata ); 80 for( int l = 0; l < data.size(); l++ ){ 81 fostream.write( data.get( l ) ); 82 } 83 }catch( IOException ie ){ 84 ie.printStackTrace(); 85 } 86 } 87} 88
Java
1package myrpg.main; 2 3import java.awt.Color; 4import java.awt.Dimension; 5import java.awt.Graphics; 6 7import java.awt.image.BufferedImage; 8 9import java.awt.event.KeyEvent; 10import java.awt.event.KeyListener; 11import java.awt.event.MouseEvent; 12import java.awt.event.MouseListener; 13import java.awt.event.MouseMotionListener; 14import java.awt.event.MouseWheelEvent; 15import java.awt.event.MouseWheelListener; 16 17import java.io.File; 18 19import javax.imageio.ImageIO; 20 21import javax.swing.JFrame; 22import javax.swing.JPanel; 23 24enum Angle 25{ 26 UP, 27 RIGHT, 28 LEFT, 29 DOWN 30} 31 32public class MyGUI extends JPanel implements KeyListener, MouseListener, MouseMotionListener, MouseWheelListener 33{ 34 Angle playerAngle; 35 BufferedImage playerimg; 36 int playerx = 32 * 3, playery = 32 * 3; 37 38 public static void main( String[] args ) 39 { 40 new MyGUI(); 41 42 FileIO.ImageChange( new File( "img/char_p_hero01.amp" ) ); 43 } 44 45 public MyGUI() 46 { 47 playerAngle = Angle.DOWN; 48 49 50 setBackground( new Color( 0xff000000, true ) ); 51 52 JFrame jf = new JFrame( "MyRPG" ); 53 jf.getContentPane().setPreferredSize( new Dimension( 640, 480 ) ); 54 jf.pack(); 55 jf.setLocationRelativeTo( null ); 56 jf.setDefaultCloseOperation( 3 ); 57 jf.add( this ); 58 jf.setVisible( true ); 59 60 addKeyListener( this ); 61 addMouseListener( this ); 62 addMouseMotionListener( this ); 63 addMouseWheelListener( this ); 64 } 65 66 @Override protected void paintComponent( Graphics g ) 67 { 68 super.paintComponent( g ); 69 requestFocusInWindow(); 70 } 71 72 @Override public void keyPressed( KeyEvent e ) 73 { 74 if( e.getKeyCode() == KeyEvent.VK_UP ) playery -= 32; 75 if( e.getKeyCode() == KeyEvent.VK_RIGHT ) playerx += 32; 76 if( e.getKeyCode() == KeyEvent.VK_LEFT ) playerx -= 32; 77 if( e.getKeyCode() == KeyEvent.VK_DOWN ) playery += 32; 78 } 79 80 @Override public void keyReleased( KeyEvent e ){} 81 82 @Override public void keyTyped( KeyEvent e ){} 83 84 @Override public void mouseClicked( MouseEvent e ){} 85 86 @Override public void mouseEntered( MouseEvent e ){} 87 88 @Override public void mouseExited( MouseEvent e ){} 89 90 @Override public void mousePressed( MouseEvent e ){} 91 92 @Override public void mouseReleased( MouseEvent e ){} 93 94 @Override public void mouseDragged( MouseEvent e ){} 95 96 @Override public void mouseMoved( MouseEvent e ){} 97 98 @Override public void mouseWheelMoved( MouseWheelEvent e ){} 99} 100
試したこと
System.out.println
を用いてデバッグ
補足情報(FW/ツールのバージョンなど)
Raspbianです。なので、ファイル区切り文字が/です。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。