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

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

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

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

Java

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

再帰

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

Q&A

解決済

1回答

1501閲覧

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

km1023

総合スコア23

NullPointerException

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

Java

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

再帰

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

0グッド

1クリップ

投稿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

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

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

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

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

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

guest

回答1

0

ベストアンサー

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

投稿2021/05/20 15:51

hope_mucci

総合スコア4447

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

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

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問