質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

299閲覧

split()した時文字列がうまく返って来ない

yukkuri

総合スコア624

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2019/01/07 03:43

前提・実現したいこと

現在、ゲームを作成していて、その再画像の暗号化を行っていました。
実際にプログラムを動かした時エラーが出たため、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です。なので、ファイル区切り文字が/です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

JavaのStringクラスのsplitメソッドで指定する文字列は正規表現です。
.の場合は任意の1文字扱いになるので期待されている動作にはなりません。
\でエスケープするなど対策が必要です。

投稿2019/01/07 04:02

dice142

総合スコア5158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問