2つ目のコードで、文字コードを指定したものを作ってみたのですが、実行時に
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
at practice.Number.main(Number.java:20)
と出てしまいます、なぜでしょうか?
Java
1 2import java.io.File; 3import java.io.FileWriter; 4import java.io.IOException; 5import java.util.HashMap; 6import java.util.Map; 7import java.util.Scanner; 8 9public class ProfileCreator { 10 11 public static void main(String[] args) { 12 // TODO 自動生成されたメソッド・スタブ 13 Map<String, String> map = getProfileInfo(); 14 15 outputTextFile(map, args[0]); 16 17 System.out.println("処理が終了しました。"); 18 19 } 20 21 public static Map<String, String> getProfileInfo() { 22 Scanner sc = new Scanner(System.in); 23 24 System.out.println("名前を入力してください"); 25 String a = sc.next(); 26 27 System.out.println("目標資格を入力してください"); 28 String b = sc.next(); 29 30 System.out.println("出身校を入力してください"); 31 String c = sc.next(); 32 33 System.out.println("メッセージを入力しください"); 34 String d = sc.next(); 35 36 HashMap<String, String> map = new HashMap<String, String>(); 37 38 map.put("name", a); 39 map.put("qualification", b); 40 map.put("school", c); 41 map.put("message", d); 42 43 return map; 44 } 45 46 public static void outputTextFile(Map<String, String> pro1, String dir) { 47 48 File file = new File(dir); 49 50 FileWriter filewriter = null; 51 try { 52 filewriter = new FileWriter(file); 53 } catch (IOException e) { 54 // TODO 自動生成された catch ブロック 55 e.printStackTrace(); 56 } 57 58 try { 59 filewriter.write(pro1.get("name")); 60 filewriter.write(pro1.get("qualification")); 61 filewriter.write(pro1.get("school")); 62 filewriter.write(pro1.get("message")); 63 filewriter.close(); 64 System.out.println("テキストファイルの作成に成功しました"); 65 } catch (IOException e) { 66 // TODO 自動生成された catch ブロック 67 e.printStackTrace(); 68 } 69 70 } 71 72} 73 74 75
java
1import java.io.BufferedWriter; 2import java.io.File; 3import java.io.FileNotFoundException; 4import java.io.FileOutputStream; 5import java.io.OutputStreamWriter; 6import java.io.PrintWriter; 7import java.io.UnsupportedEncodingException; 8import java.util.HashMap; 9import java.util.Map; 10import java.util.Scanner; 11 12public class Number { 13 14 public static void main(String[] args) { 15 // TODO 自動生成されたメソッド・スタブ 16 Map<String, String> map = getProfileInfo(); 17 18 outputTextFile(map, args[0]); 19 20 System.out.println("処理が終了しました。"); 21 22 } 23 24 public static Map<String, String> getProfileInfo() { 25 Scanner sc = new Scanner(System.in); 26 27 System.out.println("名前を入力してください"); 28 String a = sc.next(); 29 30 System.out.println("目標資格を入力してください"); 31 String b = sc.next(); 32 33 System.out.println("出身校を入力してください"); 34 String c = sc.next(); 35 36 System.out.println("メッセージを入力しください"); 37 String d = sc.next(); 38 39 sc.close(); 40 41 HashMap<String, String> map = new HashMap<String, String>(); 42 43 map.put("name", a); 44 map.put("qualification", b); 45 map.put("school", c); 46 map.put("message", d); 47 48 return map; 49 } 50 51 public static void outputTextFile(Map<String, String> pro1, String dir) { 52 53 File file = new File(dir); 54 55 try { 56 PrintWriter p_writer = new PrintWriter( 57 new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "Shift-JIS"))); 58 p_writer.println(pro1.get("name")); 59 p_writer.println(pro1.get("qualification")); 60 p_writer.println(pro1.get("school")); 61 p_writer.println(pro1.get("message")); 62 p_writer.close(); 63 System.out.println("テキストファイルの作成に成功しました"); 64 } catch (UnsupportedEncodingException | FileNotFoundException e) { 65 // TODO 自動生成された catch ブロック 66 ((Throwable) e).printStackTrace(); 67 } 68 69 } 70 71} 72
誤ってコメントでなく回答に投稿してしまったので最低限の回答は行いましたが
>Java ファイルの出力と呼び出し return文
というよりもメソッドの扱い方が理解できていないように見受けられます。
学校等の課題なのであれば、以前の内容を復習した方が宜しいかと。
意図した動作をするコードをパッと書いて回答に投げること自体は簡単ですが
「課題、問題をただ終わらせたい」のではなく
「自分で作成する力をつけたい」のであれば、分からないことについて
・何を試して
・どうなって
・何が分からない
のかを記載した方が、本人の為になるかと思います。
アドバイスありがとうございます。
試してみますね!
学校では、まだ基本的なことしか習ってなくて、mapとファイル出力に関しては習っていないんですよね(汗)
>filewriter.write(pro1);の文でエラーが出てしまいます、なぜでしょうか。
Map「pro1」から値を取り出すにはpro1.get("キーの名前")のように記述する必要があります。
コード上ではKey1~Key4が該当しますが、分かりやすい名前(名前ならname等)に変更すべきかなと。
Map (Java Platform SE 8 )
https://docs.oracle.com/javase/jp/8/docs/api/java/util/Map.html
単純に「何故か」という話
FileWriter.write()に渡せる(今渡したい)引数はString(他にもいくつかありますが、当然Mapは不可)
実際に渡そうとしているpro1はMapだからです。
分かりやすい解説ありがとうございます!
変更してみたのですがこれでよいのでしょうか?
ざっとしか見てないので、エラーを吐かないのであればMapから値を取り出すこと自体は出来てると思います。
ただ実行してみるとわかると思うんですが、改行されなくないですか?
改行というのは実行画面ででしょうか?
それとも実行結果の他に、fileの出力結果の確認て出来るのでしょうか、もしできたらその方法教えてください。
>Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
at practice.Number.main(Number.java:20)
実行時args[]に値は渡していますか?
>fileの出力結果の確認て出来るのでしょうか
実行して意図した通り動作したならばファイルが生成、書き込まれている状態になりますよね。
質問内容が最初のものと全く違っているため、一部の指摘・回答が意味不明なものになってしまっています。
元の質問は残した上で、指摘を受けて修正・実行した結果とそれに伴う質問を追記の形で記載した方が良いと思います。
値の渡し方は
コマンドプロンプトで、 java クラス名 引数 で良いのでしょうか?
javahack さん
ご指摘ありがとうございます。以降、気を付けます。
一度試されてはいかがでしょうか。