1

Javaコードを実行すると、いくつかのエラーが発生します。正常にコンパイルされますが、例外を除いてランタイムエラーが発生します。これはコードです:

import java.io.*;
class display {

private int charNumber;
private char[] currentArray;

public display() {

    charNumber = 0;

    }

public void dispText(String text, long speed, long wait) {
    while(currentArray[charNumber] != '~') {
        currentArray = text.toCharArray();
        System.out.print(currentArray[charNumber]);
        try {
            Thread.sleep(speed);
        } catch (NullPointerException e) {
            System.out.println("Error in the Thread process:\n" + e);
        } catch (InterruptedException e) {
            System.out.println("Error in the Thread process:\n" + e);
        }
        charNumber++;
        }
    charNumber = 0;
    try {
        Thread.sleep(wait);
    } catch (NullPointerException e) {
        System.out.println("Error in the Thread process:\n" + e);
    } catch (InterruptedException e) {
        System.out.println("Error in the Thread process:\n" + e);
    }
}

public void resetCharNumber() {
    charNumber = 0;
    }
}



class Main {
public static void main (String[] args) throws Exception {
    //Make sure to include a '~' at the end of every String.    
    String start = "Hey, is this thing on?~";
    String hello = "Hello, World!~";
    display d = new display();
    d.dispText(start, 200, 2000);
    d.dispText(hello, 200, 2000);
    System.out.println("\nDone!");
}
}

void dispText、テキストを表示するための文字列System.out.print、文字が表示されるたびに経過する時間を決定するための長い速度(タイプライターのように)、および次のプロセスが実行されるまでに経過する時間を決定するための長い待機を取ります。dispText文字列テキストを取得し、それをでchar配列に変換してから、text.toCharArray();whileループに入り、実行ごとに1文字を表示し、速度で指定された時間待機してから、次の文字に移動します。これは、テキストに送られる文字列の最後の文字として含まれる最後の文字('〜')に到達するまで行われます。その後、次の行に移動します。次に、mainで、「d」という名前の表示クラスのインスタンスが作成され、dはdispTextを2回実行します。

これは、実行時に発生するランタイムエラーです。

ランタイムエラー:
Main.main(Main.java:48)のdisplay.dispText(Main.java:14)
でのスレッド"main"java.lang.NullPointerExceptionの例外

4

3 に答える 3

4

配列を次のように宣言しました: -

private char[] currentArray;

しかし、あなたはそれを初期化したことはありません。次のようにコンストラクターで初期化する必要があります。

currentArray = new char[size];

または、コメントに記載されているように、配列を初期化していますが、間違った場所にあります。

while ループに次のコードがあります: -

while(currentArray[charNumber] != '~') {
        currentArray = text.toCharArray();

最初のステートメントを while ループの外に移動するだけです: -

currentArray = text.toCharArray();  // Move this outside the while
while(currentArray[charNumber] != '~') {

そして、コンストラクターで配列を初期化する必要はありません。


補足として、Java 命名規則に従ってください。クラス名は大文字で始まり、その後は CamelCasing に従う必要があります。

于 2012-11-26T20:48:23.120 に答える
1

使用する前にchar配列を初期化できませんでした。代わりに、ループ内の文字列からcharを抽出しました。(そして、ループインデックスが正しく初期化されていません)。

変化する:

public void dispText(String text, long speed, long wait) {
    while(currentArray[charNumber] != '~') {
        currentArray = text.toCharArray();
        ...

public void dispText(String text, long speed, long wait) {
    currentArray = text.toCharArray();
    for(charNumber=0; currentArray[charNumber] != '~'; charNumber++) {
        ...

ループ内からcharNumber増分を削除します。

于 2012-11-26T20:53:59.897 に答える
0

currentArray は、使用する前に初期化されていません。

while(currentArray...
于 2012-11-26T20:50:30.873 に答える