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

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

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

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

Q&A

3回答

2103閲覧

java初心者の質問です

pyonpyon_

総合スコア8

Java

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

0グッド

0クリップ

投稿2015/10/11 09:23

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("標準入力において例外が発生しました。");
}
}
}

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

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

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

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

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

guest

回答3

0

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

  1. 文字列の"+"は単純に結合しているのではない。

動作としては、(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+"さん。"); はどうなるかというと

Java

1System.out.println( 2 (new StringBuilder()) 3 .append("こんにちは、") 4 .append(person1.toString()) 5 .append("さん。") 6 .toString() 7);

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

投稿2015/10/23 20:40

raccy

総合スコア21735

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

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

0

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

まずEclipseで質問文の実装をすると、警告が出ていることに気づけると思います。
イメージ説明

これをマウスオーバーすると、警告内容が表示されます。
イメージ説明

「char[]をStringに明示的に変換する必要があります。」
と出ていますので、その通りに修正してみてください。

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

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

投稿2015/10/23 13:24

TetsujiMiwa

総合スコア1124

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

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

0

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

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

投稿2015/10/11 09:28

編集2015/10/11 15:16
swordone

総合スコア20651

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問