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

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

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

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

Q&A

解決済

4回答

2521閲覧

CSVを読み込んだあとの型変換

sobue

総合スコア329

Java

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

0グッド

0クリップ

投稿2016/04/10 09:57

編集2016/04/11 12:08

java

1 public void actionPerformed(ActionEvent e) { 2 // TODO 自動生成されたメソッド・スタブ 3 int x = 0; 4 int y = 0; 5 JFileChooser fileChooser = new JFileChooser(); 6 // SaveDialogを表示させる 7 int selected = fileChooser.showOpenDialog(this); 8 9 if (selected == fileChooser.APPROVE_OPTION) { 10 try { 11 FileReader fileReader = new FileReader(fileChooser.getSelectedFile()); 12 BufferedReader bufferedReader = new BufferedReader(fileReader); 13 14 String line; 15 StringTokenizer token; 16 17 while ((line = bufferedReader.readLine()) != null) { 18 token = new StringTokenizer(line, ","); 19 while (token.hasMoreTokens()) { 20 if (x<MASS){ 21 boardarray[x][y]=Integer.valueOf(token.nextToken()); 22 x++; 23 }else if(y<MASS){ 24 boardarray[x][y]=Integer.valueOf(token.nextToken()); 25 y++; 26 } 27 } 28 29 } 30 bufferedReader.close(); 31 } catch (Exception ex) { 32 // TODO: handle exception 33 ex.printStackTrace(); 34 } 35 36 } 37 }

上記のコードで
boardarray[x][y]=Integer.valueOf(token.nextToken());
の処理を読むとエラーになります。
中身は確認して数字であることは間違いないのですがCSV読み込みの型変換はできないのでしょうか?

すみません、補足です。
java.lang.ArrayIndexOutOfBoundsException: 10
このエラーメッセージが出ます。
ですので、配列の問題かと色々いじってはみたのですが
if (x<MASS){
boardarray[x][y]=Integer.valueOf(token.nextToken());
x++;
}else if(y<MASS){
boardarray[x][y]=Integer.valueOf(token.nextToken());
y++;
}
この部分でyの部分だけ消すとフリーズします。エラーメッセージは出ません。

補足
java.lang.ArrayIndexOutOfBoundsException: 10
at picross_play.Playboard.actionPerformed(Playboard.java:84)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6535)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
at java.awt.Component.processEvent(Component.java:6300)
at java.awt.Container.processEvent(Container.java:2236)
at java.awt.Component.dispatchEventImpl(Component.java:4891)
at java.awt.Container.dispatchEventImpl(Container.java:2294)
at java.awt.Component.dispatchEvent(Component.java:4713)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466)
at java.awt.Container.dispatchEventImpl(Container.java:2280)
at java.awt.Window.dispatchEventImpl(Window.java:2750)
at java.awt.Component.dispatchEvent(Component.java:4713)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.awt.EventQueue$4.run(EventQueue.java:731)
at java.awt.EventQueue$4.run(EventQueue.java:729)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
エラーです

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

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

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

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

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

swordone

2016/04/10 10:06

エラー(例外)のログを出してください。
KiyoshiMotoki

2016/04/11 10:24

"java.lang.ArrayIndexOutOfBoundsException: 10 "だけでは、ソースコードのどの箇所でエラーが発生しているか特定できません。表示されるエラーメッセージを【省略せず】、全て記載してください。
KiyoshiMotoki

2016/04/11 12:44

情報の追記、ありがとうございます。 追記いただいたエラーメッセージの2行目にある"Playboard.java:84"は、Playboard.javaファイルの84行目でこのエラーが発生したことを示しています。 お手数ですが、該当箇所がどこか、再度 追記願います。
guest

回答4

0

処理順序の誤りのようです。
そのプログラムですと、以下のような処理がされます。

[プログラム補足]
MASS=5だと仮定します。

[読み込むCSVファイル]
1,2,3,4,5
6,7,8,9,10

[処理順序]
if文でxがMASSを超えるまで、[0][0]、[1][0]、[2][0]・・・というようにXが加算されていきます。
この状態は、CSVファイル一行目が読み込み終わるまで続きます。

この時の変数の値は、配列への代入後インクリメントされますので、
x=6 y=0となります。

これ以降は、x<MASSが常にfalseとなるため、y<MASSの条件の処理に移ります。
その時、xの値が配列のlengthと同値となっており、
初期化した際に宣言したIndexを超えている=ArrayIndexOutOfBoundsExceptionがthrowされます。
それがエラーの発生理由です。

望ましい処理については、他の方が記載されてますので、割愛します。

投稿2016/04/12 15:23

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

sobue

2016/04/16 12:51

ありがとうございます。考えの助けになりました。
guest

0

boardarrayの変数宣言部分が見つかりませんでした。
書き漏れだったらすみません。

投稿2016/04/11 00:24

msd

総合スコア95

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

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

sobue

2016/04/11 12:11

書き漏れではなく必要ないと思ったので割愛しております。 public class Playboard extends JFrame implements ActionListener { JPanel buttonpanel = new JPanel(); JButton btn = new JButton("CSV出力"); int[][] boardarray = new int[MASS][MASS]; public Playboard() { 一番上にこれがきます。
guest

0

とりあえず今のままだと、
x,yが(0,0),(1,0),...,(MASS-1,0),(MASS-1,1),(MASS-1,2),...,(MASS-1,MASS-1)
という変化になっておそらく望む順番にならないと思います。
yを消してエラーにならずフリーズ(おそらく無限ループ)しているということは、boardarrayの2次元目の長さを間違えている可能性があるのでは?

投稿2016/04/10 14:54

swordone

総合スコア20651

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

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

sobue

2016/04/16 12:51

いつも、ありがとうございます。
guest

0

ベストアンサー

どんなエラーでしょうか?

改行コードが紛れ込んでいたりしませんか?

2016/04/11 追記

下記の部分が問題ありますね。
まず、xとyが増え続ける一方です。

Java

1while ((line = bufferedReader.readLine()) != null) { 2 token = new StringTokenizer(line, ","); 3 while (token.hasMoreTokens()) { 4 if (x<MASS){ 5 boardarray[x][y]=Integer.valueOf(token.nextToken()); 6 x++; 7 }else if(y<MASS){ 8 boardarray[x][y]=Integer.valueOf(token.nextToken()); 9 y++; 10 } 11 } 12 13}

ここでやりたいことは、一行舐めるごとにxを0にし、yをインクリメントではないですか?
おそらく下記のようになるかと。

Java

1while ((line = bufferedReader.readLine()) != null) { 2 // 外側のループは各行、つまりyに対応 3 token = new StringTokenizer(line, ","); 4 while (token.hasMoreTokens()) { 5 //内側のループは、横方向のマスに、つまりxに対応 6 if (x<MASS && y<MASS){ 7 // csvのxとyが範囲内ならboardArrayに反映 8 boardarray[x][y]=Integer.valueOf(token.nextToken()); 9 } 10 x++; 11 } 12 x = 0; 13 y++; 14}

投稿2016/04/10 12:00

編集2016/04/12 14:56
Odacchi

総合スコア907

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

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

sobue

2016/04/10 13:32

改行コードの調べ方はありますでしょうか?
Odacchi

2016/04/11 00:43

元の文に補足追記しました。 java.lang.ArrayIndexOutOfBoundsException:なので、改行コードは気にしなくていいです。
sobue

2016/04/12 13:26

すみません、教えていただいたものだと常にxが0になりboardarray[2][4]などの時がないのでそれではやりたいことと違ってしまいます
Odacchi

2016/04/12 14:54

xのインクリメント処理入ってますが。 内側のループに入ってないんでしょうか?
Odacchi

2016/04/12 14:57 編集

失礼。xのインクリメントを記述する箇所がおかしかったですね。修正しました。 修正前は、最初の一行目しか値が入らない動きになっていたはずです。
sobue

2016/04/13 13:03

x = 0; y++; の直前のX=0;のやっている意味がわかりません。 教えていただけますか?
Odacchi

2016/04/14 07:01

CSVファイルの2行目、3行目...といったとき(yを1増やす)に、横方向(x)を0に戻す必要があるのはわかりますか? 下記のように考えてみてください。xを0に戻す必要性が理解できると思います。 CSVの1行目を取得するとき、yを0に固定してxを0からMASS-1まで動かす。 CSVの2行目を取得するとき、yを1に固定してxを0からMASS-1まで動かす。 ... CSVのn行目を取得するとき、yをn-1に固定してxを0からMASS-1まで動かす。 ... CSVのMASS行目を取得するとき、yをMASS-1に固定してxを0からMASS-1まで動かす。
sobue

2016/04/16 12:50

丁寧な説明ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問