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

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

ただいまの
回答率

88.03%

java初心者の質問です

受付中

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 1,473

score 8

javaを始めたばかりの初心者です。

コマンドプロントに2つの名前(全角文字)を入力すると、

「こんにちは、●●さん。」
「はじめまして。私は▲▲です。」

と出力するプログラムを作りたいのですが、
出力結果の名前部分(●●と▲▲の部分)が文字化けしてしまいます。
(半角記号と半角英数が混じった表記になってしまいます)

以下のどこがおかしいのでしょうか?

何度も試行錯誤しているのですがうまく行かず、ご教授いただけますととても助かります。

-------------------------
import java.io.*;
import java.lang.*;

public class Hello{

 public static void main(String[] args){

  String name1,name2;

  try{
   BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

   System.out.println("1人目の名前は?");
   name1=br.readLine();
   char[] person1=name1.toCharArray();

   System.out.println("2人目の名前は?");
   name2=br.readLine();
   char[] person2=name2.toCharArray();

   System.out.println("こんにちは、"+person1+"さん。");
   System.out.println("はじめまして。私は"+person2+"です。");
   }

 catch(IOException ioe){
   System.out.println("標準入力において例外が発生しました。");
  }
 }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

+1

結論から言うと,読み込んだ文字列をtoCharArrayしたことが原因です.
何もせずSystem.out.println("こんにちは、"+name1+"さん。"); でいいのです.

String#toCharArrayの結果はcharの配列です.配列は一つのオブジェクトです.
オブジェクトはprintlnなどのメソッドに渡ったり,文字列連結の対象になった場合,そのオブジェクトのtoStringメソッドの返り値が使われます.
toStringの返り値はデフォルトではクラス名@ハッシュコードという形式の文字列になります.配列のtoStringもこの形式になります.これが,あなたが「文字化け」と思っている半角記号英数字の並びの正体です.

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+1

Eclipseのデバッグ機能を活用する方法を紹介します。

まずEclipseで質問文の実装をすると、警告が出ていることに気づけると思います。
イメージ説明
これをマウスオーバーすると、警告内容が表示されます。
イメージ説明
「char[]をStringに明示的に変換する必要があります。」
と出ていますので、その通りに修正してみてください。

わからなければ、ネット検索です。
「char[] String 変換 Java」当たりで検索すると、
http://d.hatena.ne.jp/kameid/20090313/1236959521
とか、やり方を解説してくれてるサイトにたどり着けると思います。

きちんと対応すれば、警告が解消されたマークへと代わります。
イメージ説明

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+1

swordoneさんの回答について細かい補足をしておきます。注意すべき点は2点です。

1. Javaにおいてcharの配列は文字列ではない
char[]Stringは相互変換できますが、異なる型のオブジェクトです。C言語とは違い、char[]は単なる文字の配列でしかなく、そのままでは文字列として扱うことはできません。toCharArray()char[]型のオブジェクトを取得しているようですが、これらはただの文字の配列ですので、person1person2をそのまま文字列として扱うことはできません(文字列として扱いたいのであれば、String.copyValueOf()などで明示的に文字列へ変換する必要があります)。
Java Language Specification:10.9. An Array of Characters Is Not a String

2. 文字列の"+"は単純に結合しているのではない。
動作としては、(1)String以外の型の場合はStringへ変換、(2)StringBufferを用いて文字列を結合、(3)Stringとして取り出す、となります。はじめのStringへの変換ですが、(1-1)プリミティブ型であれば、それに対応するラッパークラスで参照型(いわゆる普通のオブジェクト、配列もその一種)に変換、(1-2)nullであれば、"null"に変換、(1-3)最後にtoString()メソッドでStringに変換、となります。
Java Language Specification:5.1.11. String Conversion
Java Language Specification:5.4. String Contexts
Java Language Specification:15.18.1. String Concatenation Operator +

では、実際にSystem.out.println("こんにちは、"+person1+"さん。"); はどうなるかというと
System.out.println(
  (new StringBuilder())
    .append("こんにちは、")
    .append(person1.toString())
    .append("さん。")
    .toString()
);
のような感じで変換されます(実際はJavaのバージョンによっては異なります。また、最新のJavaではStringBufferではなく、より高速なStringBuilderを使用するようになっています)。1.で述べたようにperson1は文字列ではなくただの文字の配列(char[])です。char[]ではtoString()はオーバーライドしていないため、デフォルトの動作であるgetClass().getName() + '@' + Integer.toHexString(hashCode())を返します。[C@1a2b3c4dのような感じになったとかと思いますが、これは文字化けではなく、Javaとしてはちゃんと意味がある文字列なのです。
Java 8 API:Object#toString()

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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