71163


引数が String 型で下記のコードを実行すると true となりましたが、`String.valueOf( )` の箇所を以下の通り変更したところ
false が返ってきました。

**変更前:**

[code]

    String out =String.valueOf(ch[i]);
    
[/code]

**変更後:**

[code]

    String out =String.valueOf(ch);
    
[/code]

`(ch[i])` は一文字ずつチェックするのと `(ch)` は引数を一度にチェックする違いだと思うのですが、どうして結果が `true`,
`false` で違うのか教えて頂きたいです。

**ソースコード:**

[code]

    public boolean no01(String in){
        char[] ch = in.toCharArray();
        for(int i =0; i < ch.length(); i++){
            String out =String.valueOf(ch[i]);
            try{
                Integer.parseInt(out);
            } catch(NumberFormatException e){
                return false;
            }
        }
        return true
    }
    
    public static void main(String[] args){
        test test = new test();
        System.out.println(test.no01("789789789789");
    }
    
[/code]


CC BY-SA 4.0
2020-10-13T06:53:35.473
71162
2020-10-13T11:26:14.090
2020-10-13T11:26:14.090
3060
32774
question
java
String.valueOf(ch[i])とString.valueOf(ch);で結果が違うのは何故？


> `(ch[i])`は一文字ずつチェックするのと`(ch)`は引数を一度にチェックする違いだと思う

「一度にチェックする」と言うのが何を言いたいのかよくわからないので、少し詳しく見ていきます。

`ch`は`char[]`型、つまり「`char`型の配列」なわけですが、

  * `(ch[i])`は配列中の一文字(つまり`char`型の値)をメソッドに渡す

のに対して、

  * `(ch)`は配列全体(つまり`char[]`型の値)をメソッドに渡す

ように動作します。

Javaは型に厳しい言語ですから、通常は「`char`型を受け取るメソッドに`char`型の配列を渡す」と構文エラーになってコンパイルが通りません。

`String.valueOf(...)`の場合にエラーにならないのは、`char`型を受け取るメソッドと`char[]`型を受け取るメソッドがオーバーロードされているためです。

[`public static String valueOf(char
c)`](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#valueOf-
char-)

[`public static String valueOf(char[]
data)`](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#valueOf-
char:A-)

前者は`char`型が表す文字1文字からなる文字列を、後者は`char`型配列に含まれる全ての文字を全部順番に含む文字列を返してくれるのですが、これは「配列を渡すと一度にうまくやってくれる」機能があるのではなく、「後者のメソッドがそう動くように実装されているから」です。

なお、元の文字列が`"789789789789"`の場合、`String.valueOf(ch)`の結果は、そのまま`"789789789789"`と言う`String`型の値に戻ってしまいます。

この文字列`out`に対して`Integer.parseInt(out);`を呼ぶと、桁数が`int`で表せる値の範囲(-2147483648...2147483647)を越えていますので、例外が発生し、結果として`catch`節にある`return
false;`が実行され、結果が`false`となります。

* * *

「文字列中のすべての文字が数字だけからできている」ことをチェックしたいのでしょうか?
`Integer.parseInt(out);`を`Long.parseLong(out);`に置き換えれば、もう少し大きな数までチェックできますが、やはり限界があります。

「文字列がどんな文字からできているかチェックしたい」と言うのであれば、例えば正規表現なんかを使ってみる手もあります。

* * *

どの部分の理解が追いついていないかよくわからないので中途半端に長い説明になってしまいましたが、気になる部分についてもっと詳しく知りたいと言うことがあればコメント等してください。


CC BY-SA 4.0
2020-10-13T08:22:27.320
71163
2020-10-13T08:22:27.320
13972
71162
answer