71011


`num` にエラーがついてしまいました。 `int num = new Integer(ch[i] - '0');`
で定義していますがエラーになってしまい、未定義とエラーになります。

`Integer(ch[i] - '0');` → 黄色で線が出ます。なぜ Integer
が黒い線で引かれてしまうのかわかりません。どうしてエラーになるか教えていただきたいです。

**エラー**

[![画像の説明をここに入力](https://i.stack.imgur.com/Z3OzD.png)](https://i.stack.imgur.com/Z3OzD.png)

[![エラー](https://i.stack.imgur.com/KWwHm.png)](https://i.stack.imgur.com/KWwHm.png)

**ソースコード**

[code]

    public class angouka {
    
        public String net(String in) {
            char[] ch = in.toString().toCharArray();
            StringBuffer tes = new StringBuffer();
    
            for(int i = 0; i < 11; i++) {
                int num = new Integer(ch[i] - '0');
    
                num -= 1;
                if(num < 0) {
                    num = 9;
                }
            }
    
            tes.append(Integer.toString(num));
    
            return tes.toString();
        }
    
    }
    
[/code]


CC BY-SA 4.0
2020-10-08T04:49:52.560
71007
2020-10-08T06:19:07.720
2020-10-08T05:59:53.680
3060
32774
question
java
コードのエラー理由がわかりません。


> num にエラーがついてしまいました。 ...未定義とエラーになります。

既に Kohei TAMURA
さんのコメントで解決されたようですが、Javaのローカル変数は変数が定義されたブロック内でのみ有効なのに、元のコードでは`tes.append(Integer.toString(num));`がブロックの外に記述されていたため、`num`の有効範囲外、つまり`num`が未定義というエラーになります。

処理内容から考えて、修正後の画面キャプチャーのように、該当行をfor文のブロック内に移動するのが正しいと思われます。

ただし、`StringBuffer`(後で述べる`StringBuilder`も)の`append`メソッドは`int`型の引数を取るオーバーロードも存在するので、その行は、

[code]

                tes.append(num);
    
[/code]

と、簡単に書けます。

* * *

> `Integer(ch[i] - '0');` → 黄色で線が出ます。

私の環境では黒線は引かれなかったので、詳細は不明(警告の出力は使用するJavaコンパイラーのバージョンやコンパイル時のオプションによっても変わるので)ですが、私の環境では`Unnessesary
boxing to Integer`と表示されました。

黄色線の上にマウスカーソルを合わせると、警告メッセージが表示されないでしょうか。表示されたなら、その内容を確認してみてください。

ちなみにその行は`int`型である`ch[i] -
'0'`の結果を`Integer`型に変換し、その`Integer`型の値を代入時の暗黙変換を用いて`int`型の変数に初期値として代入する、なんてことをしています。`Integer`を用いる必要性は全くありません。

[code]

                int num = ch[i] - '0';
    
[/code]

(別質問の回答に書いたように`char`型と言うのは整数型の一種なので、演算時には自動的に`int`型に変換されます。)

* * *

直接ご質問の内容には挙がっていませんが、私の環境では次の行にも警告が表示されました。

[code]

            char[] ch = in.toString().toCharArray();
    
[/code]

`in`は`String`型であると宣言されているので、`String`型の値に`toString()`を呼んでも全くの無駄ですね。`.toString()`は削除してしまった方が良いでしょう。

また、こちらで試しに実行したところ、(修正後コードの画面キャプチャーと同様の)実行時エラーになってしまいました。すでにご自身で解決できているかもしれませんが、配列全体をfor文でなぞるときにはお試しコードであっても、ちゃんと配列の長さを参照するようにした方が良いでしょう。

さらにさらにですが、`StringBuffer`はかなり古いクラスで、特殊な条件がない限り現在では使われません。通常は`StringBuilder`クラスを使用してください。

* * *

と言うわけで、上記の修正を全て反映したコードは次のようになります。

[code]

        public String net(String in) {
            char[] ch = in.toCharArray(); //<-
            StringBuilder tes = new StringBuilder(); //<-
    
            for(int i = 0; i < ch.length; i++) { //<-
                int num = ch[i] - '0'; //<-
    
                num -= 1;
                if( num < 0 ) {
                    num = 9;
                }
    
                tes.append(num); //<-
            }
    
            return tes.toString();
        }    
    
[/code]

* * *

と言うわけで、直接ご質問内容に無いことまであれこれ書いてしまっていますが、この回答中に書かれた事柄については、(元質問中に無いことでも)新質問を立てずにコメントとしていただいた方が良いかもしれません。


CC BY-SA 4.0
2020-10-08T06:19:07.720
71011
2020-10-08T06:19:07.720
13972
71007
answer