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

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

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

null値の参照型変数を参照しようとした場合に投げられる、Javaにおける例外のひとつです。

Java

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

再帰

情報工学における再帰とは、プログラムのあるメソッドの処理上で自身のメソッドが再び呼び出されている処理の事をいいます。

Q&A

解決済

再帰手続きの空参照エラー

km1023
km1023

総合スコア23

NullPointerException

null値の参照型変数を参照しようとした場合に投げられる、Javaにおける例外のひとつです。

Java

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

再帰

情報工学における再帰とは、プログラムのあるメソッドの処理上で自身のメソッドが再び呼び出されている処理の事をいいます。

1回答

0グッド

1クリップ

1041閲覧

投稿2021/05/20 15:21

下記のコードの再帰で値をセットするsetNodeで値を入れようとするとNullPointerExceptionが出ます。
空の変数に値をセットするメソッドでなぜ空参照のエラーが出るのでしょうか?
お分かりの方ご教授ください。

Java

1import java.util.Scanner; 2 3class Node{ 4 private int value; 5 private Node child[]; 6 7 public void setNode(int value, int digit, int start, int end) { 8 this.value = value; 9 if(digit == 0) { 10 return; 11 } 12 child = new Node[26]; 13 for(int i = 0; i < 26; i ++) { 14 child[i].setNode(i + 1, digit - 1, start, end); 15 } 16 } 17 18 public int getValue() { 19 return value; 20 } 21 22 public Node getChild(int index) { 23 return child[index]; 24 } 25} 26 27public class AlphaString { 28 private static int index1; 29 private static int index2; 30 31 public static void main(String[] args) { 32 Scanner abc = new Scanner(System.in); 33 34 System.out.println("アルファベットの小文字を1文字入力してください。"); 35 String str1 = abc.next(); 36 char c1 = str1.charAt(0); 37 38 System.out.println("アルファベットの小文字をもう1文字入力してください。"); 39 String str2 = abc.next(); 40 char c2 = str2.charAt(0); 41 42 //アルファベットをabc順に並べ替え 43 index1 = c1 - 'a'; 44 index2 = c2 - 'a'; 45 if(index1 > index2) { 46 int t = index1; 47 index1 = index2; 48 index2 = t; 49 } 50 51 //ノードをインスタンス化して値をセット 52 Node root = new Node(); 53 root.setNode(0, 3,index1, index2); 54 55 //printCharacterメソッドで出力 56 for(int i = index1; i <= index2; i++) { 57 printCharacter(root.getChild(i), 3, ""); 58 } 59 } 60 61 private static void printCharacter(Node n, int digit, String str) { 62 String alpha = "abcdefghijklmnopqrstuvwxyz"; 63 char c = alpha.charAt(n.getValue() - 1); 64 65 if(digit == 1) { 66 System.out.println(str + c); 67 return; 68 } 69 70 for(int i = index1; i <= index2; i++) { 71 printCharacter(n.getChild(i), digit - 1, str + c); 72 } 73 } 74} 75

以下のような質問にはグッドを送りましょう

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

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

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

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

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

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

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

適切な質問に修正を依頼しましょう。

回答1

1

ベストアンサー

child = new Node[26]; でNode型の配列を新規作成していますが、それだけでは配列の中身は空だからです。26領域分全て null が初期値です。
この領域の中に個別に Nodeのインスタンスを作って入れなければ、null参照で例外となります。

投稿2021/05/20 15:51

hope_mucci

総合スコア4403

km1023👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

回答へのコメント

km1023

2021/05/20 16:45

下のrootはNewしただけでsetNodeができ、child[]はnewしただけではsetNodeがnull参照でエラーが出ることの違いは何でしょうか?
hope_mucci

2021/05/20 17:35

配列をNewすると、要素を入れるハコの部分ができるだけで中身はその時点ではできません。 理解できないのであれば、配列の作成方法まで戻って学習しなおしてください。どのような学習方法でも配列の作成方法は以前に学習しているはずです。
km1023

2021/05/21 00:30

基礎的なところがわかっていませんでした。 解決し、完成しました! ありがとうございます!

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

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

NullPointerException

null値の参照型変数を参照しようとした場合に投げられる、Javaにおける例外のひとつです。

Java

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

再帰

情報工学における再帰とは、プログラムのあるメソッドの処理上で自身のメソッドが再び呼び出されている処理の事をいいます。