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

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

ただいまの
回答率

87.58%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 610

score 560

前提・実現したいこと

現在、ゲームを作成していて、その再画像の暗号化を行っていました。
実際にプログラムを動かした時エラーが出たため、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)

該当のソースコード

package myrpg.main;

import java.io.*;

import java.util.ArrayList;

public final class FileIO
{
        /*
         * f には変換したいファイルを入れる
         */
//      デバッグとして img/char_p_hero01.amp というパスで File を入れてみた
    public static void ImageChange( File f )
    {
        ArrayList<Byte> data = new ArrayList<Byte>( 1 );

        short bdata;                                                //    一時的にデータを保存(Buffer data)

        try{
            FileInputStream fistream = new FileInputStream( f );        //    ファイルのバイトを読む準備

            for( int l = 0; ( bdata = (short)fistream.read() ) != -1; l++ ) data.add( (byte)bdata );
        }catch( IOException ie ){
            ie.printStackTrace();
        }

        for( int l = 0; l < data.size(); l++ ){
            byte not = (byte)~data.get( l );        // 値をビットごとに反転

            data.remove( l );
            data.add( l, not );                        //    値を削除しその位置に設置 -> 置き換え
        }

        byte copy = data.get( data.size() - 1 );        //    最初と最後を入れ替える
        data.remove( data.size() - 1 );
        data.add( data.get( 0 ) );
        data.remove( 0 );
        data.add( 0, copy );

        String bpath = f.getPath();
        String[] paths = bpath.split( File.separator );

        System.out.println( bpath );                   // img/char_p_hero01.amp
        for( int l = 0; l < paths.length; l++ ){
            System.out.println( paths[ l ] );      // img (改行) char_p_hero01.amp
        }

        String path = "";
        for( int l = 0; l < paths.length - 1; l++ ){
            path += paths[ l ];
            path += File.pathSeparator;
        }

        String fname = paths[ paths.length - 1 ];
        String[] filenames = fname.split( "." );

        System.out.println( "fname:" + fname );     // fname:char_p_hero01.amp
        for( int l = 0; l < filenames.length; l++ ){
            System.out.println( "filenames[" + l + "]" + filenames[ l ] ); // 一切表示されない
        }

        if( filenames.length == 2 ){                    //    aaa.bb なら
            filenames[ 1 ] = ".rbi";
        }else if( filenames.length == 1 ){                //    aaa なら
            filenames[ 0 ] += ".rbi";
        }else{                                            //    aaa.bb.cc などなら
            filenames[ filenames.length - 1 ] = ".rbi";      // エラー箇所
        }

        for( int l = 0; l < filenames.length; l++ ){
            path += filenames[ l ];
        }

        byte[] rbisdata = { (byte)0xF0, (byte)0x00, (byte)0x15, (byte)0xFF, (byte)0x55 };    //    .rbiを示すデータ

        try{
            FileOutputStream fostream = new FileOutputStream( new File( path ) );

            fostream.write( rbisdata );
            for( int l = 0; l < data.size(); l++ ){
                fostream.write( data.get( l ) );
            }
        }catch( IOException ie ){
            ie.printStackTrace();
        }
    }
}
package myrpg.main;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;

import java.awt.image.BufferedImage;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;

import java.io.File;

import javax.imageio.ImageIO;

import javax.swing.JFrame;
import javax.swing.JPanel;

enum Angle
{
    UP,
    RIGHT,
    LEFT,
    DOWN
}

public class MyGUI extends JPanel implements KeyListener, MouseListener, MouseMotionListener, MouseWheelListener
{
    Angle playerAngle;
    BufferedImage playerimg;
    int playerx = 32 * 3, playery = 32 * 3;

    public static void main( String[] args )
    {
        new MyGUI();

        FileIO.ImageChange( new File( "img/char_p_hero01.amp" ) );
    }

    public MyGUI()
    {
        playerAngle = Angle.DOWN;


        setBackground( new Color( 0xff000000, true ) );

        JFrame jf = new JFrame( "MyRPG" );
        jf.getContentPane().setPreferredSize( new Dimension( 640, 480 ) );
        jf.pack();
        jf.setLocationRelativeTo( null );
        jf.setDefaultCloseOperation( 3 );
        jf.add( this );
        jf.setVisible( true );

        addKeyListener( this );
        addMouseListener( this );
        addMouseMotionListener( this );
        addMouseWheelListener( this );
    }

    @Override protected void paintComponent( Graphics g )
    {
        super.paintComponent( g );
        requestFocusInWindow();
    }

    @Override public void keyPressed( KeyEvent e )
    {
        if( e.getKeyCode() == KeyEvent.VK_UP )    playery -= 32;
        if( e.getKeyCode() == KeyEvent.VK_RIGHT ) playerx += 32;
        if( e.getKeyCode() == KeyEvent.VK_LEFT )  playerx -= 32;
        if( e.getKeyCode() == KeyEvent.VK_DOWN )  playery += 32;
    }

    @Override public void keyReleased( KeyEvent e ){}

    @Override public void keyTyped( KeyEvent e ){}

    @Override public void mouseClicked( MouseEvent e ){}

    @Override public void mouseEntered( MouseEvent e ){}

    @Override public void mouseExited( MouseEvent e ){}

    @Override public void mousePressed( MouseEvent e ){}

    @Override public void mouseReleased( MouseEvent e ){}

    @Override public void mouseDragged( MouseEvent e ){}

    @Override public void mouseMoved( MouseEvent e ){}

    @Override public void mouseWheelMoved( MouseWheelEvent e ){}
}

試したこと

System.out.printlnを用いてデバッグ

補足情報(FW/ツールのバージョンなど)

Raspbianです。なので、ファイル区切り文字が/です。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.58%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る